L'interfaccia per la funzione find
è/era:
func find<C : CollectionType where C.Generator.Element : Equatable>(domain: C,
value: C.Generator.Element) -> C.Index?
Questo dice che il CollectionType
di C
deve avere elementi che sono Equatable
e, inoltre, che il value
deve anche essere Equatable
.
[Nota Swift 3.0: A partire da Swift 3.0, è necessario utilizzare la funzione index
disponibile in due varianti. Nella prima, si fornire il proprio predicato:
func index(where: (Self.Generator.Element) -> Bool) -> Self.Index?
Nel secondo, gli elementi devono essere equatable:
// Where Generator.Element : Equatable
func index(of: Self.Generator.Element) -> Self.Index?
Se si decide di andare via equatable
, si applica il seguente . Nota Fine]
tuo Score
struct non è Equatable
e quindi l'errore. Dovrai capire cosa significa che i punteggi siano uguali tra loro. Forse è un "punteggio" numerico; forse è un 'punteggio' e un 'id utente'. Dipende dall'astrazione Score
. Una volta che sai, è implementare ==
utilizzando:
func == (lhs:Score, rhs:Score) -> Bool {
return // condition for what it means to be equal
}
Nota: se si utilizza class
e quindi i punteggi hanno 'identità', allora è possibile implementare questa come:
func == (lhs:Score, rhs:Score) -> Bool { return lhs === rhs }
Il vostro esempio con le stringhe funziona perché String
è Equatable
. Se si guarda nel codice della libreria Swift si vedrà:
extension String : Equatable {}
func ==(lhs: String, rhs: String) -> Bool
Hai già trovato il motivo. 'Score' deve implementare il protocollo' Equatable' (non importa se struct o class). –
Probabilmente lo stesso problema qui: http://stackoverflow.com/questions/27887387/how-to-use-contains-with-two-arrays-of-objects –