Как преобразовать 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.
Не уверен, что приведенный выше код соответствует лучшим рекомендациям, поскольку я все еще пытаюсь обдумать детали всех этих протоколов.