2014-11-11 17 views
6

Mam następujący w Swift:Wykonywanie Swift klasę zgodne z protokołem, który wymaga init

protocol FooConvertible{ 
    typealias FooType 

    init(foo: FooType) 
} 

mogę zrobić Swift klas dostosowania się do niej w definicji klasy:

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

Jak na razie dobrze. Jednak problem pojawia się, gdy staram się klasa z nim zgodne w rozszerzeniu (z klas kakao, to moja jedyna opcja, ponieważ nie mam źródła):

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 

    } 
} 

Ten used to be possible w poprzednie wersje językowe

Jaki był powód usunięcia?

Oznaczałoby to, że wszystkie XXXLiteralConvertible Protocols są zakazane na zajęciach z kakao!

+0

Fakt ten został jasno przedstawiony przez [dokumentację] (https://developer.apple.com/library/mac/documentation/Swift/Conceptual/Swift_Programming_Language/Extensions.html#//apple_ref/doc/ uid/TP40014097-CH24-XID_235). – CodaFi

+0

Gdzie jest napisane, że możesz dodawać wygody do klas Swift, ale nie do klas Cocoa? – cfischer

+0

Nie wolno ci także tego robić. Twój przykład nie kompiluje się. – CodaFi

Odpowiedz

1

jakaś szansa, staramy się stworzyć coś takiego:

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 będą teraz wiedzieć o wszystkich inits z FooConvertible. Jeśli tak, cieszę się, że mogłem pomóc. :)

Powiązane problemy