Generische Erweiterung für Array in Swift

8

Um ganz offen zu sein, bin ich völlig neu in der Entwicklung und Nutzung von Erweiterungen.

Ich wollte eine Kategorie erstellen (Erweiterung in swift 3.0), die in einer Anwendung verwendet werden kann, um wiederholte Operationen für Array durchzuführen.

Beispiellink 1

Dies habe ich während der Recherche gesehen und verstanden. Ich wollte eine Erweiterung mit verschiedenen Methoden erstellen, die generisch sein sollten, und nicht auf der Grundlage des Datentyps, der zum Erstellen separater Erweiterungen benötigt wird.

Hier im obigen Beispiel müssen wir eine einzelne Erweiterung erstellen, wenn wir uns für eine bestimmte Datentyp-weise Erweiterung entscheiden. Ich wollte eine Anleitung haben, wenn es irgendeinen Weg gibt, um die generische Kategorie (Extension in swift) zu erstellen.

  1. extension _ArrayType where Generator.Element == Int
  2. extension Array where Element: Equatable
  3. extension Array where Element == Int
  4. extension _ArrayType where Generator.Element == Float
  5. extension SequenceType where Self.Generator.Element: FloatingPointType
  6. extension Array where Element: DoubleValue
  7. extension Sequence where Iterator.Element == String

, etc ...

Beispiellink 2

Hinweis: Kurz gesagt, können wir davon ausgehen, dass ich Aktionen auf Basis von Array in einer einzelnen Erweiterung durchführen möchte, anstatt nur die Single zu erstellen Erweiterung für jeden der Datentypen gemäß obiger Anforderung.

    
Jignesh Fadadu 18.04.2017, 11:25
quelle

2 Antworten

8

Wie in den Kommentaren erwähnt, ist dies möglich, indem Sie ein eigenes Protokoll erstellen, das die Typen, die Sie abdecken möchten, übernimmt (in den Kommentaren hat jemand es Content genannt) (von erste Quelle ):

%Vor%

Es scheint jedoch, dass die ursprüngliche Frage hauptsächlich nach generischen Erweiterungen für Arrays fragt, die laut einem Kommentar nicht möglich sind, aber in Swift 100% möglich sind (es handelt sich tatsächlich um ein großes Swift-Feature) (von zweite Quelle ).

Wenn Sie beispielsweise nur für Int s eine spezifische Erweiterungsmethode definieren möchten, können Sie Folgendes tun:

%Vor%

Es scheint, dass die ursprünglichen Anforderungen der Frage Erweiterungsmethoden sind, die agnostisch zum Datentyp sein können und deshalb gemeinsam verwendet werden sollten. Wenn ich das richtig verstehe, scheint es, dass diese Datentypen im Allgemeinen eine gewisse Übereinstimmung mit Equatable und / oder Hashable haben, was die Mindestanforderung für diese Art von generischen Inhalten ist. Mit dieser Elementkonformität ist dies jedoch möglich:

%Vor%

Die Swift-Syntax ändert sich schnell, und was hier angezeigt wird, kann schnell veralten, aber Dieser Leitfaden wird von Apple ziemlich aktuell gehalten und zeigt die aktuellste Syntax für Generics oben ^.

Meine Antwort bezieht sich auf ein paar StackOverflow Fragen / Antworten, zum Beispiel / Syntax oben ^. Quelle: (SO-Quelle) (SO-Quelle 2)

Zusammenfassend können alle oben genannten Methoden für eine vollständig benutzerdefinierte Erweiterungslösung kombiniert werden, die beide generischen Funktionen / vars für alle Array -Typen hat, während sie weiterhin typspezifische Erweiterungsüberschreibungen enthält.

    
BHendricks 22.04.2017 10:29
quelle
5

In where-Klausel geben Sie Folgendes an: "Wenn der Elementtyp diese Regeln aufweist, berücksichtigen Sie diese Erweiterung".

Sie müssen nicht alle Methoden in allen Erweiterungen implementieren.

Zum Beispiel:

  • Sie möchten Array<Element> auf die Methode foo(_:Element) erweitern:

    %Vor%
  • Sie möchten Array<Element> erweitern, wo Element Equatable implementiert hat (einschließlich Int , Double und ... oder alle Strukturen / Klassen, die Sie als Equatable markiert haben):

    %Vor%
  • Sie möchten Array<Element> erweitern, wenn Element Integer ist, die Summe der get-only Variablen:

    %Vor%
  • Sie möchten Collection<Collection<Element: Equatable>> erweitern, um eine Methode zum Vergleich mit 2D-Sammlungen zu erhalten:

    %Vor%

Sie müssen Array oder Sammlung nicht erweitern, um Methoden wie sort , find , etc ... zu haben. Die meisten dieser Methoden sind bereits innerhalb des Compilers erweitert, wenn Ihre Element: Equatable oder Element: Comparable . Mit map , filter und reduce können Sie komplexere Strukturen mit wenig Code erreichen.

    
farzadshbfn 22.04.2017 22:13
quelle

Tags und Links