Напишите генератор для пользовательского класса словаря в Swift с помощью Generics

SWIFT/IOS/Словарь/Генератор/Последовательность

Я создал упорядоченный словарь, используя сообщение в блоге http://timekl.com/blog/2014/06/02/learning-swift-ordered-dictionaries/

Как описано в блоге, я реализовал индексы для этого класса, чтобы получить доступ к элементу базового словаря.

Теперь, чтобы пройти по словарю в цикле FOR IN для (ключ, значение) в orderDict

Я понимаю, что мне нужно написать генератор и последовательность. Я также знаю два протокола. Из другого блога, http://natashatherobot.com/swift-conform-to-sequence-protocol/ Я пытаюсь создать генератор для своего словаря, но не могу этого сделать. Любая помощь в этом отношении будет очень полезной


person nkp    schedule 28.07.2015    source источник


Ответы (2)


Получил ответ, вам нужно будет добавить следующий код, расширяющий упорядоченный словарь с помощью SequenceType и добавив метод Generate.

/// extension class

extension OrderedDictionary: SequenceType {

    /// Creates a generator for each (key, value)
    func generate() -> GeneratorOf<(Tk , Tv)> {
        var index = 0
        return GeneratorOf<(Tk , Tv)> {
            if index < self.count {
                let key = self.keys[index]
                let value = self[index]
                index++
                return (key, value!)
            } else {
                index = 0
                return nil
            }
        }
    }
}
person nkp    schedule 28.07.2015

Я нашел еще один упорядоченный словарь на https://github.com/Marxon13/M13DataStructures/blob/master/Classes/OrderedDictionary.swift

И я использовал записи var из этого примера, который возвращает массив, поэтому мы можем использовать генератор массива:

struct ADOrderedDictionary<Tk: Hashable, Tv:Equatable>:SequenceType
(etc.)

    var entries:Array<(Tk, Tv)> {
    get {
        var tempArray:Array<(Tk, Tv)> = []
        for key: Tk in keys {
            let value = values[key]!
            tempArray.append(key, value)
        }
        return tempArray
    }
}

func generate() -> IndexingGenerator<[(Tk,Tv)]>
{
    return self.entries.generate()
}

Это позволяет «для (ключ, значение) в упорядоченном словаре»

person Dan Selig    schedule 08.12.2015