2014-10-07 11 views
6

Posiadałem kod, który działał w wersji beta w wersji XCode 6, ale ostatnio przestał działać po aktualizacji do kodu 6.1.Protokół Swif określający metodę klasy powracającego klienta

To mój protokół:

protocol CanDeserialiseFromJson { 
    class func FromJson(json : JSONValue) -> Self 
} 

Jest to realizacja:

extension Invoice : CanDeserialiseFromJson { 
    class func FromJson(json : JSONValue) -> Self { 
     return Invoice() 
    } 
} 

nie ta daje błąd:

'Invoice' is not convertable to 'Self' 

Jak powiedziałem, to używane do pracy i mogę nie rozumiem, dlaczego to już nie jest

+0

Porównaj http://stackoverflow.com/a/24182819/1187415. –

+0

Zobacz: http://stackoverflow.com/questions/25645090/protocol-func-returning-self/25645689#25645689 –

Odpowiedz

3

Self w protokole jest wymaganiem, aby implementacje protokołu używały własnego typu. Ponieważ Invoice jest typem, w którym przyjmujesz protokół, Twoja implementacja FromJson powinna mieć typ powrotu Invoice.

+1

Co to robi: return Invoice() –

+0

On oznacza, że ​​typem zwrotu powinien być "Faktura" :) – fluidsonic

+1

Następnie nie byłby zgodny z protokołem: Metoda "FromJson" w klasie niezwiązanej z końcem "Faktura" musi zwracać 'Self', aby była zgodna z protokołem" CanDeserialiseFromJson " –

3

W porządku. Twoja metoda została zadeklarowana jako zwracająca Self, a Ty zwracasz Invoice. Metody klasy są dziedziczone, aw podklasach typem podklasy jest Self, a Invoice nie jest podtypem tego typu.

Aby rzeczywiście powrócić Self, zakładając Invoice ma required init() konstruktora, można zrobić coś takiego:

extension Invoice : CanDeserialiseFromJson { 
    class func FromJson(json : JSONValue) -> Self { 
     return self() 
    } 
} 
Powiązane problemy