2015-08-12 15 views
5

Geçenlerde gelen bir uzantısı değiştirmek başardı sıraylaCollectionType için bir uzantı nasıl tanımlayabilirim, böylece yöntemleri sözlüklerde kullanılabilir mi?</p> <pre><code>extension Array where Element: Encodable { ... } </code></pre> <p>için:

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

sonra farklı uzantısında CollectionType ve Encodable tip kısıtlamaları uygulamak mümkün.

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

için:

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

Ancak, ikinci Dictionary türü için geçerli bir değişiklik olmadığı görülüyor

Şimdi değişen, Dictionary ile aynı şeyi yapmaya çalışıyorum Artık uzantı içinde tanımlanan yöntemler sözlüklere çağrılmaz.

CollectionType (veya belki SequenceType) uzantılarını, sözlüklerinin sözlüklerde kullanılabilmesi için nasıl tanımlayabilirim?


Güncelleme başarılı olamadı ben şöyle ben tip sınırlamalar ekleyerek denedim dikkat etmek istedik

:

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

Güncelleme 2

Kullanıcı2194'ten beri 039 sordu - bunu yapmak ve uzantıları Array ve Dictionary tutmak için tercih etmem. Ancak, Optional değişkenleri için de uzantılar yazmam gerekiyor. Benim anlayışım, jeneriklerin kullanımı nedeniyle, Optional için Array veya Dictionary'a sınırlayan bir tür kısıtlaması yazmanın mümkün olmamasıdır.

Bu benim şimdiki kullanım durumu için çalışıyor
+0

cevabınızın), uzantınızdaki kısıtlamaların bir dicti yapısına çok bağlı olduğu durumlarda, 'Dictionary' yerine 'CollectionType' sözcüğünü genişletmenin ne gibi bir faydası olduğunu sorabilir miyim? onary? Not; Gerçek bir soru! – justinpawela

+0

@ user2194039 kısaca, JSON kodlaması. Daha fazla bilgi için buraya bakınız: https://github.com/edwardaux/Ogra/pull/1 –

+0

@ user2194039 Sorunuzu yanlış anladım. Çekme isteğinde gösterildiği gibi, 'İsteğe Bağlı' için uzantılar oluşturmam gerekiyordu ve bunlar için tür kısıtlamalarında 'Array' veya 'Sözlük' kullanılamadı. –

cevap

2

: çok yardımcı etmedi çözümünüzü yazabilmek için

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

sayesinde o yüzden 3 hızlı şekilde çözüm dönüştürülen ama benim için niçin çalışmadığını bilmiyorum Çözümümüzü göndermek istiyorum belki başkasına yardım edebilirim.

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

Ben de belirli bir türe koleksiyonunu sınırlamak başardı:

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

anahtar oldu Yardımlarınız için Iterator.Element == (key: Self.Key, value: Self.Value)

Teşekkür

kişisel meraktan (ve ışıkta
İlgili konular