2015-08-06 9 views
14

E 'possibile avere tipi annidati dichiarata all'interno di protocolli, in questo modo:tipi annidati all'interno di un protocollo

protocol nested{ 

    class nameOfClass { 
     var property: String { get set } 
    } 

} 

Xcode dicono che "non si digita ammessi qui", quindi, se voglio creare un protocollo che ha bisogno di avere un tipo annidato, questo non è possibile o posso farlo in altro modo?

risposta

19

Un protocollo non può richiedere un tipo annidato, ma può richiedere un tipo associato conforme ad un altro protocollo. Un'implementazione potrebbe utilizzare un tipo annidato o un alias di tipo per soddisfare questo requisito.

protocol Inner { 
    var property: String { get set } 
} 
protocol Outer { 
    associatedtype Nested: Inner 
} 

class MyClass: Outer { 
    struct Nested: Inner { 
     var property: String = "" 
    } 
} 

struct NotNested: Inner { 
    var property: String = "" 
} 
class MyOtherClass: Outer { 
    typealias Nested = NotNested 
} 
+0

fresco, ma non capire una cosa! Cosa significano le tipealias di codice Nested = NotNested? – LettersBa

+1

Crea un alias di tipo per soddisfare i requisiti di 'Outer'. Ora c'è un nuovo nome per 'NotNested' come se fosse annidato in' MyOtherClass'. Se 'Outer' ha dichiarato qualsiasi uso di' Nested', questo potrebbe probabilmente essere dedotto dal compilatore. – ughoavgfhw

0

Ecco il codice, ma in un modo che funziona:

protocol Nested { 
    associatedtype NameOfClass: HasStringProperty 

} 
protocol HasStringProperty { 
    var property: String { get set } 
} 

e si può usare in questo modo

class Test: Nested { 
    class NameOfClass: HasStringProperty { 
     var property: String = "Something" 
    } 
} 

Spero che questo aiuti!

0

In alternativa, si può avere proprietà di istanza/tipo all'interno di un protocollo che si conformano a un altro protocollo:

public protocol InnerProtocol { 
    static var staticText: String {get} 
    var text: String {get} 
} 

public protocol OuterProtocol { 
    static var staticInner: InnerProtocol.Type {get} 
    var inner: InnerProtocol {get} 
} 

public struct MyStruct: OuterProtocol { 
    public static var staticInner: InnerProtocol.Type = Inner.self 
    public var inner: InnerProtocol = Inner() 

    private struct Inner: InnerProtocol { 
     public static var staticText: String { 
      return "inner static text" 
     } 
     public var text = "inner text" 
    } 
} 

// for instance properties 
let mystruct = MyStruct() 
print(mystruct.inner.text) 

// for type properties 
let mystruct2: MyStruct.Type = MyStruct.self 
print(mystruct2.staticInner.staticText)