2015-08-12 13 views
5

Byłem niedawno w stanie zmienić rozszerzenie z:Jak zdefiniować rozszerzenie do elementu CollectionType, aby jego metody były dostępne dla słowników?

extension Array where Element: Encodable { ... } 

do:

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

aby później móc zastosować ograniczenia typ z CollectionType i Encodable w innym rozszerzeniem.

Teraz staram się zrobić to samo z Dictionary, zmieniając:

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

do:

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

Jednakże ten ostatni nie wydaje się być ważny substytut typu Dictionary , ponieważ metod zdefiniowanych w rozszerzeniu nie można wywoływać w słownikach.

Jak zdefiniować rozszerzenie do CollectionType (lub może SequenceType), aby jego metody były dostępne dla słowników?


Aktualizacja

Chciałem zauważyć, że próbowałem dodanie ograniczenia typu następująco, bez powodzenia:

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

Od użytkownika2194 039 pytanie - wolałbym nie robić tego i zachować rozszerzenia na Array i Dictionary.

Muszę jednak również napisać rozszerzenia dla wariantów Optional. Rozumiem, że ze względu na użycie generycznych, nie można napisać ograniczenia typu dla Optional, które ogranicza to do Array lub Dictionary.

+0

Out osobistej ciekawości (iw świetle odpowiedzi), czy mogę zapytać, jakie korzyści rozszerzasz 'CollectionType' zamiast' Dictionary', kiedy ograniczenia twojego rozszerzenia są tak głęboko powiązane ze strukturą dyktowania onary? P.S. Prawdziwe pytanie! – justinpawela

+0

@ user2194039 w skrócie, kodowanie JSON. Więcej informacji można znaleźć tutaj: https://github.com/edwardaux/Ogra/pull/1 –

+0

@ user2194039 Źle zrozumiałem twoje pytanie. Jak pokazano w żądaniu ściągnięcia, musiałem również utworzyć rozszerzenia dla "Opcjonalnie" i nie mogłem użyć 'Tablicy' lub' Słownika' w ograniczeniach typów dla tych. –

Odpowiedz

2

To działa na moim obecnym przypadku użycia:

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

Dzięki za komentarz swoje rozwiązanie pomogło dużo, ja konwertowane swoje rozwiązanie na szybki 3, ale nie wiem, dlaczego to nie działa dla mnie, więc Chcę opublikować moje rozwiązanie, może może pomóc komuś innemu.

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

byłem też w stanie ograniczenie poboru do konkretnego typu:

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

Kluczem było Iterator.Element == (key: Self.Key, value: Self.Value)

Dzięki za pomoc

Powiązane problemy