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.
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.
extension _ArrayType where Generator.Element == Int
extension Array where Element: Equatable
extension Array where Element == Int
extension _ArrayType where Generator.Element == Float
extension SequenceType where Self.Generator.Element: FloatingPointType
extension Array where Element: DoubleValue
extension Sequence where Iterator.Element == String
, etc ...
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.
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 ):
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:
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:
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.
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:
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):
Sie möchten Array<Element>
erweitern, wenn Element
Integer ist, die Summe der get-only Variablen:
Sie möchten Collection<Collection<Element: Equatable>>
erweitern, um eine Methode zum Vergleich mit 2D-Sammlungen zu erhalten:
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.
Tags und Links swift swift-extensions