Swift kann Nicht rufen Sie 'finden,' mit einer Liste von Argumenten des Typs '([Score], Partitur), " wo die Partitur ist ein struct
Während find(["a", "b"], "c")
funktioniert ohne Probleme, ich erhalte eine Fehlermeldung, wenn Sie versuchen zu finden, die den index einer Struktur in einem array von Strukturen:
struct Score
{
//...
}
var scores: [Score] = //...
var score: Score = //...
find(self.scores, score) // Error: Cannot invoke 'find' with an argument list of type '([Score], Score)'
Obwohl ich es könnte ein problem mit Strukturen, die können nicht miteinander verglichen werden standardmäßig. Aber ändern Score
s definition class
gibt mir den gleichen Fehler.
- Sie haben bereits den Grund dafür gefunden.
Score
implementieren mussEquatable
protocol (egal ob struct oder Klasse). - Wahrscheinlich das gleiche Problem wie hier: stackoverflow.com/questions/27887387/...
Du musst angemeldet sein, um einen Kommentar abzugeben.
EDIT: da der Swift 2.0 gibt es jetzt eine integrierte version von
find
nimmt, dass eine Schließung, so dass Sie nicht haben, um schreiben Sie Ihre eigene – aber auchfind
umbenannt wurdeindexOf
, und ist nun eine Protokoll-Erweiterung vonCollectionType
, so rufen Sie es wie eine Methode:Original pre-2.0 Antwort unten
Während das Antworten, was darauf hindeutet, machen Sie Ihre Klasse
Equatable
kann gut funktionieren, würde ich empfehlen, ein bisschen Achtung vor der Auswahl, dies zu tun. Der Grund dafür ist, dass, wie die docs Zustand, equatability impliziert die Substituierbarkeit, und Ihre==
operator ist reflexiv, symmetrisch und transitiv. Wenn Sie nicht einhalten können, können Sie einige sehr seltsame Verhalten bei der Verwendung von algorithmen wieequals
,sort
etc. Seien Sie besonders vorsichtig, wenn die UmsetzungEquatable
auf non-final Klassen. Wenn Sie sicher sind, dass Sie den Anforderungen entsprechen, gehen Sie für es, undfind
arbeiten.Wenn nicht, eine alternative, die Sie könnte in Erwägung ziehen, ist das schreiben einer Funktion, die sollte werden in der standard-Bibliothek, aber nicht, das ist ein
find
nimmt Verschluss:Sobald Sie dieses haben, können Sie liefern alle matching-Kriterien, die Sie bevorzugen. Zum Beispiel, wenn Sie Ihre Objekte sind Klassen, die Sie verwenden könnten, Referenz-Gleichheit:
indexOf
umbenannt wurde, umindex(of:)
im Swift-3.Schnittstelle für die Funktion
find
ist/war:Diese besagt, dass die
CollectionType
vonC
müssen Elemente, dieEquatable
und ferner, dass dievalue
muss auchEquatable
.[Hinweis Swift 3.0: Als der Swift 3.0, Sie müssen, verwenden Sie die
index
Funktion, die kommt in zwei Varianten. In der ersten, liefern Sie Ihre eigenen Prädikat:In der zweiten, Ihre Elemente müssen gleichsetzbar:
Wenn Sie sich entscheiden, um die
equatable
route, dann gilt Folgendes.Hinweis Ende]
Ihre
Score
struct ist nichtEquatable
und daher der Fehler. Werden Sie brauchen, um herauszufinden, was es bedeutet, für erzielt werden gleich zu einer anderen. Vielleicht ist es einigen numerischen 'Punkte'; vielleicht ist es ein 'score' und 'user-id'. Es hängt von IhremScore
Abstraktion. Sobald Sie wissen, Sie umzusetzen==
mit:Hinweis: wenn Sie
class
und damit erzielt haben "Identität", dann können Sie dies umsetzen als:Dein Beispiel mit strings funktioniert, weil
String
istEquatable
. Wenn man sich in der Swift-code für die Bibliothek und Sie werden sehen:Wie die anderen schon sagten, die Objekte, die Sie suchen, entsprechen müssen, um die Gleichsetzbar Protokoll.
So müssen Sie eine Erweiterung hinzufügen, um Ihre Punktzahl struct, das sagt dem compiler, dass er entspricht, dass das Protokoll:
Und dann müssen Sie die Umsetzung der = = - Funktion für die Klasse:
Score
eineclass
statt? Nicht==
gültig für Klassen?