interfejs dla funkcji find
jest/było:
func find<C : CollectionType where C.Generator.Element : Equatable>(domain: C,
value: C.Generator.Element) -> C.Index?
Ten mówi, że CollectionType
z C
musi mieć elementy, które są Equatable
, a ponadto, że value
należy również Equatable
.
[Uwaga Swift 3.0: od wersji Swift 3.0 trzeba użyć funkcji index
, która występuje w dwóch wersjach. W pierwszym, będziemy dostarczać swoje własne orzeczenie:
func index(where: (Self.Generator.Element) -> Bool) -> Self.Index?
w drugim, Twoje elementy muszą być equatable:
// Where Generator.Element : Equatable
func index(of: Self.Generator.Element) -> Self.Index?
Jeśli zdecydujesz się pójść drogą equatable
, wówczas stosuje się następujące . Uwaga Koniec]
Twój Score
struct nie jest Equatable
i stąd błąd. Musisz dowiedzieć się, co to znaczy, że wyniki są sobie równe. Może to jakiś numeryczny "wynik"; może to jest "wynik" i "identyfikator użytkownika". To zależy od abstrakcji Score
. Gdy wiesz, wdrożyć ==
używając:
func == (lhs:Score, rhs:Score) -> Bool {
return // condition for what it means to be equal
}
Uwaga: jeśli używasz class
a więc wyniki mają „tożsamość”, a następnie można zaimplementować to jako:
func == (lhs:Score, rhs:Score) -> Bool { return lhs === rhs }
Twój przykład z ciągów działa, ponieważ String
to Equatable
. Jeśli spojrzeć na kod SWIFT biblioteki zobaczysz:
extension String : Equatable {}
func ==(lhs: String, rhs: String) -> Bool
Znaleźliście już przyczynę. 'Score' musi implementować protokół' Equatable' (bez względu na to, czy jest to struktura czy klasa). –
Prawdopodobnie ten sam problem, co tutaj: http://stackoverflow.com/questions/27887387/how-to-use-contains-withtwoys-grows-of-objects –