2015-08-12 14 views
5

Recentemente sono stato in grado di cambiare un'estensione da:Come definire un'estensione su CollectionType in modo che i suoi metodi siano disponibili per i dizionari?

extension Array where Element: Encodable { ... } 

a:

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

per essere successivamente in grado di applicare vincoli di tipo con CollectionType e Encodable in una diversa estensione.

Ora sto cercando di fare la stessa cosa con Dictionary, cambiando:

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

a:

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

Tuttavia, quest'ultimo non sembra essere un valido sostituto per il tipo Dictionary , poiché ora i metodi definiti all'interno non possono essere chiamati sui dizionari.

Come è possibile definire un'estensione su CollectionType (o forse SequenceType) in modo che i relativi metodi siano disponibili per i dizionari?


Aggiornamento

ho voluto sottolineare che ho provato ad aggiungere vincoli di tipo come segue, senza successo:

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

Dal momento che user2194 039 chiesto - Preferirei non doverlo fare e mantenere le estensioni a Array e Dictionary.

Tuttavia, ho anche bisogno di scrivere estensioni per le varianti Optional. La mia comprensione è che a causa del loro uso di generici, non è possibile scrivere un vincolo di tipo per Optional che lo vincola a Array o .

+0

Per curiosità personali (e alla luce della tua risposta), posso chiedere quale vantaggio ottieni estendendo 'CollectionType' invece di' Dictionary', quando i vincoli sul tuo interno sono così profondamente legati alla struttura di un dicti onary? Post scriptum Una vera domanda! – justinpawela

+0

@ user2194039 in breve, codifica JSON. Si prega di vedere qui per ulteriori informazioni: https://github.com/edwardaux/Ogra/pull/1 –

+0

@ user2194039 ho frainteso la tua domanda. Come mostrato nella richiesta pull, avevo anche bisogno di creare estensioni per 'Optional' e non potevo usare' Array' o 'Dictionary' nei vincoli di tipo per quelli. –

risposta

2

Questo funziona per il mio attuale caso d'uso:

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

Grazie per pubblicare la tua soluzione ha aiutato molto, mi sono convertito la soluzione a rapida 3, ma non so perché non funzionava per me, così Voglio postare la mia soluzione forse può aiutare qualcun altro.

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

sono stato anche in grado di vincolo alla raccolta a un tipo specifico:

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

La chiave era Iterator.Element == (key: Self.Key, value: Self.Value)

Grazie per il vostro aiuto

Problemi correlati