2014-07-24 10 views
94

Aggiornamento: Per la migliore spiegazione possibile del motivo per cui questo è il modo in cui è check out this video.Che cosa significa "Protocollo ... può essere usato solo come un vincolo generico perché ha dei requisiti di tipo Self o associati"?


Sto cercando di creare un dizionario (in realtà un HashSet) calettato su un protocollo personalizzato a Swift, ma mi sta dando l'errore nel titolo e non posso fare testa né coda di esso.

protocol Observing: Hashable { 
} 

...

var observers = HashSet<Observing>() 
+0

possibile duplicato di [Come creare un dizionario che può contenere qualcosa in Chiave? o tutto il tipo possibile in grado di contenere] (http://stackoverflow.com/questions/24119624/how-to-create-dictionary-that-can-hold-anything-in-key-or-all-the-possible -type) – jtbandes

+0

@jtbandes Questo non è un duplicato. Sto chiedendo cosa significa in realtà il messaggio di errore. Che cos'è un "requisito di tipo Self o associato"? – devios1

+0

possibile duplicato di [Utilizzo di protocolli come tipi di array e parametri di funzione in swift] (http://stackoverflow.com/questions/24888560/usage-of-protocols-as-array-types-and-function-parameters-in- swift) – newacct

risposta

68

protocollo Observing eredita dal protocollo Hashable, che a sua volta eredita da protocollo Equatable. Protocollo Equatable ha il seguente requisito:

func ==(lhs: Self, rhs: Self) -> Bool 

E un protocollo che contiene Self qualche parte dentro di esso non può essere utilizzato ovunque tranne che in un vincolo di tipo.

Here è una domanda simile.

+6

... perché il compilatore deve assicurarsi che sia lo * stesso * tipo su entrambi i lati, ma il protocollo garantisce solo che rispetti il ​​contratto. Io vedo. Tuttavia, sembra che 'Equitable' non debba necessariamente implicare' Equitable' poiché non è strettamente necessario generare un codice hash. – devios1

+4

Oh no aspetta, perché 'Dictionary' deve essere in grado di sapere se un determinato oggetto è effettivamente la chiave corretta, perché è possibile che due diversi oggetti generino lo stesso codice hash. Hmm, è un po 'complicato. Quindi il problema qui è in realtà con 'Equitable'. – devios1

+3

Guardate 0:56 nella grande presentazione di Alexis Gallagher intitolata: Protocolli con tipi associati e come hanno ottenuto in questo modo (forse) https://youtu.be/XWoNjiSPqI8 – finneycanhelp

3

Per risolvere questo problema è possibile utilizzare i generici. Considerare questo esempio:

class GenericClass<T: Observing> { 
    var observers = HashSet<T>() 
}