Ich habe zwei generische Funktionen definiert
%Vor%und wenn ich versuche, einen von ihnen aufzurufen, zum Beispiel mit:
%Vor% natürlich beschwert sich Swift und gibt einen Fehler aus. Mehrdeutige Verwendung von 'job'
Das ist verständlich, weil es nicht klar ist, ob ich die Vergleichbar one oder Hashable ( Int ) für beide verwenden soll.
Gibt es eine Möglichkeit, den Compiler anzudeuten, welchen ich verwenden möchte?
Dies ist mehrdeutig, da Int
sowohl Hashable
als auch Comparable
ist und keines dieser beiden Protokolle in derselben Hierarchie liegt. (Sie können die Protokollhierarchie Int
auf Swifter anzeigen .)
Sie können nicht explizit angeben, welche Funktion aufgerufen werden soll, aufgrund der zugehörigen Typanforderungen für jedes Protokoll, aber was Sie tun können definieren eine dritte Funktion:
%Vor% So implementiert Swift den Operator ..<
, der ansonsten für Typen, die beide% implementieren, nicht eindeutig ist. co_de% und Comparable
.
Um ein wenig weiter zu gehen, hier ist ein Blick auf das, was ich mit "Sie kann nicht explizit sagen, welche Funktion zu nennen, wegen der damit verbundenen Typ Anforderungen von jedem Protokoll." Protokolle können als Typen verwendet werden, wie im Swift-Buch beschrieben. Kapitel über Protokolle :
%Vor% In diesem Beispiel kann die generator -Eigenschaft ein beliebiger Typ sein, der ForwardIndexType
entspricht - ähnlich wie RandomNumberGenerator
in Objective-C verwendet wird. Protokolle können jedoch nur als Typen verwendet werden, wenn sie in ihrer Deklaration keinen zugeordneten Typ oder Verweis id<ProtocolName>
enthalten. Dies schließt leider fast jeden eingebauten Typ in Swift aus, einschließlich Self
und Hashable
.
Comparable
erbt von Hashable
, das Equatable
referenziert, wenn der Operator Self
definiert wird:
und ==
machen dasselbe mit ihren Operatoren:
Diese Protokolle können nur als generische Bedingungen verwendet und nicht als Typ bei der Deklaration einer Variablen verwendet werden. (Soweit ich das beurteilen kann, ist dies undokumentiert, aber durch Fehlermeldungen feststellbar.)
Zwei Protokolle, die diese Einschränkung nicht haben, sind Comparable
und Printable
, also können wir uns ansehen, wie sie funktionieren. BooleanType
ist der einzige integrierte Typ, der mit Bool
übereinstimmt, und auch BooleanType
, also wird dies unser Testtyp sein. Hier sind unsere generischen Funktionen Printable
und die Variable p()
- Beachten Sie, dass wir die Funktion nicht wie bisher mit t
aufrufen können:
Stattdessen müssen wir (% upcast?) t
mit dem Schlüsselwort t
an ein bestimmtes Protokoll übergeben und eine bestimmte generische Funktion aufrufen:
Solange wir ein qualifizierendes Protokoll haben, können wir wählen, welche Variante der generischen Methode aufgerufen werden soll.
Ich mache die exercism.io-Programmierungsübungen und die Tests, die ich an meinem Code durchführen muss, haben das Ziel, sich miteinander zu vergleichen. Der Quellcode der Übung kann hier Ссылка
gefunden werden
Nach dem, was ich verstanden habe, ist bridgeToObjectiveC Äpfel interne Methoden, um Dinge zu tun und deshalb wurden sie entfernt. Mit ihnen bekomme ich %code% , was sehr verständlich ist, wenn sie es entfernt haben.
Ohne die Methode, die nur die Parameter im AssertEquals-Aufruf verwendet, bekomme ich %code% . Sind zwei Werte in Swift nicht vergleichbar? Wie würde ich tun, um sie vergleichbar zu machen?
Sie können die Gleichheit der Wörterbücher überprüfen, solange die Werte %code% sind. Ändern Sie %code% so, dass eine generische Integritätsbedingung enthalten ist:
%Vor%Versuchen Sie
%Vor%Erzwingt, dass der Compiler einfach abhebt und ruft die %code% -Methode für beide Methoden auf.
Nein, Swift-Wörterbücher sind nicht direkt vergleichbar. Zum Testen von Einheiten können Sie entweder manuelle Vergleiche ihrer Größen und paarweiser Elementvergleiche durchführen, oder Sie können die einfache Sache machen und %code% s daraus erstellen und sie auf diese Weise vergleichen.