2015-02-23 2 views
7

Могу ли я подклассифицировать SwiftDictionary, так что я могу передать свои настройки Dictionary методам, которые ожидают обычного Dictionary?Создайте подкласс Swift Dictionary?

Редактировать

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

+0

Ouch. Это было быстро -2. –

+1

Если бы вы это сделали, я был бы признателен за комментарий о том, почему я не повторяю ту же ошибку. –

+0

Я не спускал вниз, но если бы я угадал, это потому, что вы не предоставили никакого кода, который показывает текущие попытки, или то, что вы пробовали до сих пор. – Marcus

ответ

7

Swift словари - это структуры, а не классы, поэтому они не могут быть подклассами. В идеале, методы, с которыми вы работаете, объявлялись бы в зависимости от ситуации с соответствующим образом сгенерированным общим типом CollectionType (или ExtensibleCollectionType, или SequenceType, в зависимости от ситуации), а не специально Словарем.

Если это не поможет вам по какой-либо причине, вы можете вместо этого подклассифицировать NSDictionary.

(редактировать), и, как указывает Антонио, вы можете сделать расширение Dictionary {...}, чтобы добавить вещи в структуру словаря, которая в некоторых случаях может заменить подклассификацию.

1

Нет, словари и массивы в стрижа являются структурами, которые не поддерживают наследование. Единственный способ «персонализировать» словарь - это использовать расширения.

0

Хотя я согласен с большинством замечаний здесь (Вы не можете создать подкласс Struct, по дизайну это не класс), вы можете получить результаты, которые вы хотите с обычаем Struct, который соответствует CollectionType (теперь переименован Collection в Swift 3.0):

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 

} 

Вы можете перегрузить метод индексирования так, что он добавляет ключ к keyOrder массива. Затем укажите итератор, который вернет (Key, Value) кортежей в правильном порядке.

Возможно, вам даже не нужно соответствовать Collection, но это хороший способ получить бесплатную функциональность.

4

Ниже представлена ​​структура, соответствующая коллекции, которая делегирует словарь. Довольно легко изменить любые потребности.

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? Я вообще не могу скомпилировать его. И да, у меня есть протокол 'MyKindOfValue' –

+0

Попробуйте сейчас. Я добавил еще два индекса и индексов. Это проходит сейчас для меня. В оригинале был сбой компилятора (!!) для меня, но если вы посмотрите на ошибки из компилятора (до того, как он завершится сбой), вы можете сделать вывод о том, чего не хватает. – user3763801