2014-10-26 18 views
22

zdefiniowałem prostą klasę:Jak spełnić protokół zawierający inicjator?

class MyClass { 
    var name:String? 

    required init() { 
     println("init") 
    } 
} 

mogę dodać nowy inicjator w przedłużeniu tak:

extension MyClass { 
    convenience init(name: String) { 
     self.init() 
     self.name = name 
    } 
} 

Wszystko działa poprawnie.

Ale jak tylko zdefiniować nowy inicjator w protokole:

protocol MyProtocol { 
    init(name:String) 
} 

I make my rozszerzenie potwierdzić tego protokołu:

extension MyClass : MyProtocol { 
    convenience init(name: String) { 
     self.init() 
     self.name = name 
    } 
} 

pojawia się następujący błąd:

Initializer requirement 'init(name:)' can only be satisfied by a required initializer in the definition of non-final class 'MyClass'

Co dzieje się tutaj?

(BTW. Nie mogę wykonywać moją klasę final, ponieważ jest to tylko wyciąg z bardziej skomplikowanych przypadków użycia)

+1

Może to być w tej chwili problem: https://devforums.apple.com/message/1057171#1057171 – Klaas

Odpowiedz

16

Ok, mój błąd.

Aby zagwarantować, że wszystkie podklasy są zgodne z MyProtocol, nowy inicjator musi również zostać oznaczony jako required.

Ponadto Swift wymaga zadeklarowania wszystkich wymaganych inicjalizatorów bezpośrednio w klasie i nie pozwala zadeklarować ich w rozszerzeniach.

+2

Zgadzam się: jak tylko skopiowałem - wkleiłem moje rozszerzenie do samej klasy, wszystko działało. – user2013

+2

Nie rozumiem. Czy pokazałbyś swój kod po rozwiązaniu? –

+0

Poszedłem za tą odpowiedzią i otrzymałem inicjator 'required convenience'. Łał. – kelin