2015-08-12 5 views
5

war ich vor kurzem der Lage, von einer Verlängerung zu ändern:Wie kann ich eine Erweiterung für CollectionType definieren, so dass ihre Methoden für Wörterbücher verfügbar sind?

extension Array where Element: Encodable { ... } 

zu:

extension CollectionType where Generator.Element: Encodable { ... } 

, um später in der Lage seinen Typ Einschränkungen mit CollectionType und Encodable in einer anderen Erweiterung anzuwenden.

Jetzt versuche ich, mit Dictionary das Gleiche zu tun, zu ändern:

extension Dictionary where Key: StringLiteralConvertible, Value: Encodable { ... } 

zu:

extension CollectionType where Generator.Element == (Key: StringLiteralConvertible, Value: Encodable) { ... } 

Jedoch scheint die letztere kein gültiger Ersatz für den Dictionary Typ zu sein , da jetzt in der Erweiterung definierte Methoden nicht in Wörterbüchern aufgerufen werden können.

Wie kann ich eine Erweiterung zu CollectionType (oder vielleicht SequenceType) definieren, so dass ihre Methoden für Wörterbücher verfügbar sind?


aktualisieren

Ich wollte anmerken, dass ich versucht habe, das Hinzufügen Typ Einschränkungen wie folgt, ohne Erfolg:

extension CollectionType where Self: protocol<Indexable, SequenceType, DictionaryLiteralConvertible>, Self.Key: protocol<Hashable, StringLiteralConvertible>, Self.Value: Encodable, Self.Generator.Element == (Key: StringLiteralConvertible, Value: Encodable) { ... } 

Update 2

Seit user2194 039 gefragt - Ich würde es vorziehen, dies nicht tun zu müssen und die Erweiterungen auf Array und Dictionary zu behalten.

Allerdings muss ich auch Erweiterungen für die Optional Varianten schreiben. Mein Verständnis ist, dass es aufgrund ihrer Verwendung von Generika nicht möglich ist, eine Typbeschränkung für Optional zu schreiben, die es auf Array oder Dictionary beschränkt.

+0

aus persönlicher Neugier (und in Licht Antwort: Kann ich fragen, welchen Nutzen Sie haben, wenn Sie 'CollectionType' anstelle von' Dictionary' erweitern, wenn die Einschränkungen Ihrer Erweiterung so stark mit der Struktur eines Diktats verknüpft sind Onary? P.S. Eine echte Frage! – justinpawela

+0

@ user2194039 kurz, JSON-Codierung. Bitte sehen Sie hier für weitere Informationen: https://github.com/edwardaux/Ogra/pull/1 –

+0

@ user2194039 Ich missverstanden Ihre Frage. Wie in der Pull-Anforderung gezeigt, musste ich auch Erweiterungen für 'Optional' erstellen und konnte' Array' oder 'Dictionary' nicht in den Typ-Einschränkungen für diese verwenden. –

Antwort

2

Das für meinen aktuellen Anwendungsfall funktioniert:

extension CollectionType where Self: DictionaryLiteralConvertible, Self.Key: StringLiteralConvertible, Self.Value: Encodable, Generator.Element == (Self.Key, Self.Value) { ... } 
1

Vielen Dank für Ihre Lösung Entsendung viel geholfen hat, umgewandelt ich Ihre Lösung swift 3, aber weiß nicht, warum es nicht für mich arbeitet, so Ich möchte meine Lösung posten, kann vielleicht jemand anderem helfen.

extension Collection where Self: ExpressibleByDictionaryLiteral, Self.Key: ExpressibleByStringLiteral, Self.Value: ExpressibleByStringLiteral, Iterator.Element == (key: Self.Key, value: Self.Value) { ... } 

war ich auch in der Lage, die Sammlung zu einer bestimmten Art Beschränkung:

extension Collection where Self: ExpressibleByDictionaryLiteral, Self.Key == String, Self.Value == Array<String>, Iterator.Element == (key: Self.Key, value: Self.Value) 

Der Schlüssel war Iterator.Element == (key: Self.Key, value: Self.Value)

Danke für Ihre Hilfe

Verwandte Themen