Domanda Posso avere una funzione init in un protocollo?


Quando provo a implementare il mio protocollo in questo modo:

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

Ottengo un errore dicendo: Identificatore previsto nella dichiarazione di funzione. 

Perché ricevo questo errore?


44
2017-09-05 21:42


origine


risposte:


Si, puoi. Ma non hai mai messo func di fronte a init:

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

78
2017-09-06 01:58



Punti chiave qui:

  1. Il protocollo e la classe che lo implementa, mai avere la parola chiave func di fronte a init metodo.
  2. Nella tua classe, dal momento che init il metodo è stato chiamato nel tuo protocollo, ora devi prefisso il init metodo con la parola chiave required. Questo indica che un protocollo conforme a te richiesto per questo init metodo (anche se potresti aver pensato indipendentemente che fosse una grande idea).

Come coperto da altri, il tuo protocollo sarebbe simile a questo:

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

E ad esempio, una classe conforme a questo protocollo potrebbe essere così:

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

Notare il necessario parola chiave di fronte al init metodo.


21
2018-06-20 19:58