Cosa significa "Protocollo ... può essere utilizzato solo come vincolo generico perché ha requisiti di tipo Self o associati"?


123

Sto provando a creare un dizionario (in realtà un HashSet ) codificato su un protocollo personalizzato in Swift, ma mi sta dando l'errore nel titolo:

Il protocollo "myProtocol" può essere utilizzato solo come vincolo generico perché ha requisiti di tipo Self o associati

e non posso farne testa né croce.

protocol Observing: Hashable { }

var observers = HashSet<Observing>()


@jtbandes Non è un duplicato. Chiedo cosa significa effettivamente il messaggio di errore. Che cos'è un "requisito di tipo autonomo o associato"?
devios1

Risposte:


90

Il protocollo Observingeredita dal protocollo Hashable, che a sua volta eredita dal protocollo Equatable. Il protocollo Equatableha il seguente requisito:

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

E un protocollo che contiene Selfda qualche parte al suo interno non può essere utilizzato da nessuna parte se non in un vincolo di tipo.

Ecco una domanda simile.


7
... perché il compilatore deve assicurarsi che sia dello stesso tipo su entrambi i lati, ma il protocollo garantisce solo che soddisfi il contratto. Vedo. Tuttavia, sembra Equatableche non debba necessariamente implicare Equatablepoiché non è strettamente necessario per generare un codice hash.
devios1

4
Oh no aspetta lo fa, perché Dictionarydeve essere in grado di sapere se un dato oggetto è davvero la chiave corretta, perché è possibile che due oggetti diversi generino lo stesso codice hash. Hmm, questo è un po 'complicato. Quindi il problema qui è davvero con Equatable.
devios1

4
Guarda 0:56 nella grande presentazione di Alexis Gallagher intitolata: Protocolli con tipi associati e come sono arrivati ​​in quel modo (forse) youtu.be/XWoNjiSPqI8
finneycanhelp

@finneycanhelp Grazie per questo 👍👍. Bel video!
devios1

11

Per risolvere questo problema potresti usare i generici. Considera questo esempio:

class GenericClass<T: Observing> {
   var observers = HashSet<T>()
}
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.