Wie wird in Swift eine mehrdeutige generische Funktion aufgerufen?

8

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?

    
Bartek Chlebek 29.09.2014, 20:29
quelle

1 Antwort

10

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 .)

%Vor%

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:

%Vor%

und == machen dasselbe mit ihren Operatoren:

%Vor%

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:

%Vor%

Stattdessen müssen wir (% upcast?) t mit dem Schlüsselwort t an ein bestimmtes Protokoll übergeben und eine bestimmte generische Funktion aufrufen:

%Vor%

Solange wir ein qualifizierendes Protokoll haben, können wir wählen, welche Variante der generischen Methode aufgerufen werden soll.

    
Nate Cook 29.09.2014, 20:50
quelle

Tags und Links

Django: Verwenden von Annotate, Count und Distinct in einem Queryset ___ qstntxt ___

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?

    
___ answer26093322 ___

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%     
___ tag123xcode ___ Xcode ist Apples integrierte Entwicklungsumgebung (IDE). NUTZUNGSHINWEIS: Verwenden Sie dieses Tag nur für Fragen zur Xcode-IDE selbst und nicht für allgemeine Mac- oder iOS-Programmierungsthemen. Verwenden Sie [Kakao] für Mac-Programmierfragen und [Kakaotouch] oder [ios] oder [Swift] für iOS-Programmierfragen. ___ tag123swift ___ Swift ist eine universelle Open-Source-Programmiersprache, die von Apple Inc. für ihre Plattformen und Linux entwickelt wurde. Verwenden Sie das Tag nur für Fragen zu Sprachfunktionen oder für Code in Swift. Verwenden Sie die Tags [ios], [osx], [watch-os], [tvos], [cocoa-touch] und [cocoa] für (sprachunabhängige) Fragen zu den Plattformen oder Frameworks. ___ tag123objectivec ___ Dieses Tag sollte nur bei Fragen verwendet werden, die sich auf Objective-C-Funktionen beziehen oder von Code in der Sprache abhängen. Die Tags [Kakao] und [Kakao-Touch] sollten verwendet werden, um nach Frameworks oder Klassen von Apple zu fragen. Verwenden Sie die verwandten Tags [ios], [macos], [apple-watch] und [tvos] für Probleme, die für diese Plattformen spezifisch sind. ___ tag123xctest ___ XCTest ist ein von Apple bereitgestelltes Framework, das Komponententestfunktionen implementiert. Es funktioniert mit iOS 7 und allen Versionen von OS X. ___ answer39664133 ___

Versuchen Sie

%Vor%

Erzwingt, dass der Compiler einfach abhebt und ruft die %code% -Methode für beide Methoden auf.

    
___ answer26092984 ___

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.

    
___