2014-10-07 6 views
6

Avevo codice che funzionava in XCode 6 beta ma che ha smesso di funzionare di recente dopo l'aggiornamento a xcode 6.1.Protocollo Swift che definisce il metodo di classe che restituisce l'auto

Questo è il mio protocollo:

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

Si tratta di implementazione:

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

Questo non dando errore:

'Invoice' is not convertable to 'Self' 

Come ho detto, questo usato per funzionare e posso capisco perché non funziona più

+0

Confronta http://stackoverflow.com/a/24182819/1187415. –

+0

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

risposta

3

Self in un protocollo è un requisito che le implementazioni del protocollo utilizzano il proprio tipo. Dal momento che il Invoice è il tipo in cui si sta adottando il protocollo, l'implementazione di FromJson deve avere un tipo di ritorno Invoice.

+1

Che cosa fa: restituire la fattura() –

+0

Significa che il tipo di reso deve essere "Fattura" :) – fluidsonic

+1

Quindi non sarebbe conforme al protocollo: Metodo 'FromJson' nella classe non finale 'Invoice' deve restituire 'Self' per conformarsi al protocollo 'CanDeserialiseFromJson' –

3

È giusto. Il tuo metodo è dichiarato per restituire Self, mentre stai restituendo Invoice. I metodi di classe sono ereditati e in sottoclassi, Self sarà tale tipo di sottoclasse e Invoice non è un sottotipo di quel tipo.

Per tornare in realtà Self, assumendo Invoice ha un costruttore required init(), si può fare qualcosa di simile:

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