2014-11-11 12 views
6

Ho il seguente in Swift:Fare una classe Swift conformi ad un protocollo che richiede un init

protocol FooConvertible{ 
    typealias FooType 

    init(foo: FooType) 
} 

posso fare Swift classi conformi ad esso nella definizione della classe:

class Bar: FooConvertible { 
    var baz: String = "" 
    required init(foo: String){ 
     baz = foo 
    } 
} 

Fin qui tutto bene. Tuttavia, il problema si pone quando cerco di fare una classe conforme ad essa in un interno (Con le classi di cacao, è la mia unica opzione, in quanto non ho la fonte):

class Baz { 
    var baz = "" 
} 

extension Baz: FooConvertible{ 

    required convenience init(foo: String) { // Insists that this should be in the class definition 
     baz = foo 
    } 
} 

extension NSURL: FooConvertible{ 

    required convenience init(foo: String) { // this also fails for the same reason 

    } 
} 

Questo used to be possible, nelle precedenti versioni della lingua

Qual è il motivo per cui è stato rimosso?

Ciò significherebbe che tutti i protocolli XXXLiteralConvertible sono banditi dalle classi Cocoa!

+0

Questo fatto è spiegato chiaramente dalla [documentazione] (https://developer.apple.com/library/mac/documentation/Swift/Conceptual/Swift_Programming_Language/Extensions.html#//apple_ref/doc/ uid/TP40014097-CH24-XID_235). – CodaFi

+0

Dove si dice che è possibile aggiungere praticità alle classi Swift ma non alle lezioni di Cocoa? – cfischer

+0

Non sei autorizzato a farlo neanche. Il tuo esempio non viene compilato. – CodaFi

risposta

1

C'è qualche possibilità che si sta cercando di creare qualcosa di simile:

protocol FooConvertible : class { 
    typealias FooType 

    var baz : String { get set } // protocol extensions inits may need to know this 

    init(foo: FooType) // this is your designated initializer 
} 

extension FooConvertible { 

    // init(foo: String) { 
    //  self.init(foo: foo) 
    //  baz = foo 
    // } 
    // you can't do this because it could call it self recursively 

    init(num: Int) { // this init will call your designated init and can instantiate correctly 
     self.init(foo: "\(num)") 
    } 
} 

class Baz { 
    var baz = "" 
} 

class Bar: FooConvertible { 
    var baz: String = "" 

    required init(foo: String) { // designated initializer 
     baz = foo 
    } 
} 

Baz sarà ora conoscere tutti INITs di FooConvertible. Se è così, sono contento di poterti aiutare. :)