2015-02-23 27 views
7

Özel Dictionary ürünümün normal bir Dictionary beklediği yöntemlere geçirebilmem için SwiftDictionary alt sınıfını alabilir miyim?Bir Swift Dictionary alt sınıfı oluşturun?

Düzenleme

In my case, I want my custom Dictionary to iterate through its keys in insertion-order.

+0

Ahh. Bu hızlı bir -2 oldu. –

+1

Eğer bunu -1'lediyseniz, neden bir yorumda bulunursam, aynı hatayı tekrar yapmadım. –

+0

Reddetmedim, ama tahmin etmeliydim, çünkü şu anki girişimleri gösteren bir kod ya da şimdiye kadar denediğin şeyleri göstermedin. – Marcus

cevap

7

Swift sözlükleri yapılar değil, sınıflar, bu nedenle sınıflandırma edilemez. İdeal olarak, birlikte çalıştığınız yöntemler, özellikle bir Sözlük yerine, uygun şekilde kısıtlanmış genel bir CollectionType (veya duruma bağlı olarak ExtensibleCollectionType veya SequenceType) almaya bildirilir. Bu herhangi bir nedenle sizin için işe yaramazsa

, sen NSDictionary yerine alt sınıfı olabilir. Antonio işaret

(edit) gibi, bazı durumlarda subclassing yerini alabilir Sözlük yapı, bir şeyler eklemek için uzatma Sözlük {...} yapabilirsiniz. Burada yorum çoğu kabul ederken

1

Hayır, Swift içinde sözlükler ve diziler devralma desteklemeyen yapılar vardır. Bir sözlüğü "kişiselleştirmek" tek yolu uzantıları kullanmaktır.

0

, istediğiniz sonuçları CollectionType uyan özel bir Struct elde edebileceğiniz (eğer bu bir sınıf değil tasarım tarafından Struct, alt sınıf olamaz) (şimdi Collection değiştirildi) Swift 3.0: bu keyOrder diziye anahtar ekler, böylece

struct YourCustomDictionary<Key : Hashable, Value>: Collection { 

    private var elements = Dictionary<Key, Value>() 
    private var keyOrder = Array<Key>() 

    //your custom implementation here 
    //including tracking for your dictionary order 

} 

Sen indis yöntemi aşılmasına neden olabilir. Ardından, (Key, Value) tuplesini doğru sırada döndürecek bir yineleyici sağlayın.

Muhtemelen bile Collection uyması gerekmez, ancak bu ücretsiz işlevselliği bir sürü almak için iyi bir yoldur.

4

şu ki delegeler bir sözlüğe Koleksiyonu uygun olan bir yapıdır. Herhangi bir ihtiyaca göre değişiklik yapmak oldukça kolaydır.

public struct MyDictionary<Key: Hashable, Value: MyKindOfValue>: Collection { 
    public typealias DictionaryType = Dictionary<Key, Value> 
    private var dictionary: DictionaryType 

    //Collection: these are the access methods 
    public typealias IndexDistance = DictionaryType.IndexDistance 
    public typealias Indices = DictionaryType.Indices 
    public typealias Iterator = DictionaryType.Iterator 
    public typealias SubSequence = DictionaryType.SubSequence 

    public var startIndex: Index { return dictionary.startIndex } 
    public var endIndex: DictionaryType.Index { return dictionary.endIndex } 
    public subscript(position: Index) -> Iterator.Element { return dictionary[position] } 
    public subscript(bounds: Range<Index>) -> SubSequence { return dictionary[bounds] } 
    public var indices: Indices { return dictionary.indices } 
    public subscript(key: Key)->Value? { 
     get { return dictionary[key] } 
     set { dictionary[key] = newValue } 
    } 
    public func index(after i: Index) -> Index { 
     return dictionary.index(after: i) 
    } 

    //Sequence: iteration is implemented here 
    public func makeIterator() -> DictionaryIterator<Key, Value> { 
     return dictionary.makeIterator() 
    } 

    //IndexableBase 
    public typealias Index = DictionaryType.Index 
} 
+0

Swift 3 için doğru mu? Ben hiç derleyemem. Ve Evet protokolü var 'MyKindOfValue' –

+0

Şimdi deneyin. İki tane daha fazla abone ve dizin ekledim. Şimdi benim için geçer. Orijinal de benim için derleyici (!!) çöküyordu, ancak derleyiciden (çökerttikten önce) hatalara bakarsanız, neyin eksik olduğunu anlayabilirsiniz. – user3763801

İlgili konular