2014-09-05 11 views
42

Quando cerco di implementare il mio protocollo in questo modo:Posso avere una funzione init in un protocollo?

protocol Serialization { 
    func init(key keyValue: String, jsonValue: String) 
} 

ottengo un errore che dice: identificatore Previsto in dichiarazione di funzione.

Perché viene visualizzato questo errore?

+0

Perché lo vuoi in un protocollo? Perché è importante come viene creato il tipo? – Mark

+4

Un oggetto può avere più funzioni di init. Perché non avere uno prescritto da un protocollo come quello che potrebbe essere chiamato? –

+6

Ecco perché la parola chiave 'func' prima di' init'. Rimuovilo e riprova. –

risposta

76

Sì, è possibile. Ma non avete mai messo func davanti init:

protocol Serialization { 
    init(key keyValue: String, jsonValue: String) 
} 
+1

Puoi spiegare il motivo per cui non hai messo func di fronte a init? Grazie. – LiweiZ

+4

@LiweiZ: perché gli inizializzatori e i metodi sono separati – newacct

+0

Grazie. Immagino di dover passare ancora una volta i documenti dello sviluppatore :) – LiweiZ

16

Punti chiave qui:

  1. Il protocollo e la classe che lo implementa, mai avere la parola chiave func davanti al metodo di init.
  2. Nella classe, poiché il metodo init è stato richiamato nel protocollo, ora è necessario prefisso il metodo init con la parola chiave required. Questo indica che un protocollo conforme ti ha richiesto di avere questo metodo init (anche se potresti aver pensato indipendentemente che fosse una buona idea).

Come coperto da altri, il protocollo sarebbe simile a questa:

protocol Serialization { 
    init(key keyValue: String, jsonValue: String) 
} 

E come esempio, una classe che è conforme a questo protocollo potrebbe apparire in questo modo:

class Person: Serialization { 
    required init(key keyValue: String, jsonValue: String) { 
     // your logic here 
    } 
} 

Avviso il ha richiesto la parola chiave di fronte al metodo init.

Problemi correlati