Как преобразовать NSMutableOrderedSet в универсальный массив?

У меня есть это для цикла, p это NSManagedObject, fathers это to-many отношения, поэтому мне нужно бросить NSMutableOrderedSet в [Family] но это не работает, почему?

for f in p.fathers as [Family] {
}

введите описание изображения здесьвведите описание изображения здесь

2 ответа

Решение

Вы можете получить представление массива множества через array свойство - тогда вы можете уменьшить его до нужного типа и присвоить переменной:

let families = p.fathers.array as [Family]

но, конечно, вы также можете использовать его непосредственно в цикле:

for f in p.fathers.array as [Family] {
    ....
}

В этом случае следует использовать простое решение Antonio. Я просто хотел бы обсудить это немного подробнее. Если мы попытаемся перечислить экземпляр 'NSMutableOrderedSet' в 'for' цикл, компилятор будет жаловаться:

ошибка: тип "NSMutableOrderedSet" не соответствует протоколу "SequenceType"

Когда мы пишем

for element in sequence {
    // do something with element
}

компилятор переписывает это примерно так:

var generator = sequence.generate()

while let element = generator.next() {
    // do something with element
}

'NS(Mutable)OrderedSet' не имеет 'generate()' метод, т.е. он не соответствует 'SequenceType' протокол. Мы можем изменить это. Сначала нам нужен генератор:

public struct OrderedSetGenerator : GeneratorType {

    private let orderedSet: NSMutableOrderedSet

    public init(orderedSet: NSOrderedSet) {
        self.orderedSet = NSMutableOrderedSet(orderedSet: orderedSet)
    }

    mutating public func next() -> AnyObject? {
        if orderedSet.count > 0 {
            let first: AnyObject = orderedSet.objectAtIndex(0)
            orderedSet.removeObjectAtIndex(0)
            return first
        } else {
            return nil
        }
    }
}

Теперь мы можем использовать этот генератор, чтобы сделать 'NSOrderedSet' соответствовать 'SequenceType':

extension NSOrderedSet : SequenceType {
    public func generate() -> OrderedSetGenerator {
        return OrderedSetGenerator(orderedSet: self)
    }
}

'NS(Mutable)OrderedSet' Теперь можно использовать в 'for' цикл:

let sequence = NSMutableOrderedSet(array: [2, 4, 6])

for element in sequence {
    println(element) // 2 4 6
}

Мы могли бы в дальнейшем реализовать 'CollectionType' а также 'MutableCollectionType' (последний для 'NSMutableOrderedSet' только) сделать 'NS(Mutable)OrderedSet' ведут себя как стандартные коллекции библиотеки Swift.

Не уверен, что приведенный выше код соответствует лучшим рекомендациям, поскольку я все еще пытаюсь обдумать детали всех этих протоколов.

Другие вопросы по тегам