我有for for循环,p
是NSManagedObject
,fathers
是to-many
关系,所以我需要将NSMutableOrderedSet
强制转换为{{1}但它不起作用,为什么?
[Family]
答案 0 :(得分:24)
您可以通过array
属性获取集合的数组表示 - 然后您可以将其向下转换为正确的类型并分配给变量:
let families = p.fathers.array as [Family]
但当然你也可以直接在循环中使用它:
for f in p.fathers.array as [Family] {
....
}
答案 1 :(得分:2)
在这种情况下,应使用Antonio的简单解决方案。我想再讨论一下这个问题。如果我们尝试在'NSMutableOrderedSet'
循环中枚举'for'
的实例,编译器会抱怨:
错误:输入' NSMutableOrderedSet'不符合协议 '序列类型'
当我们写
时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的标准库集合相同。
不确定上述代码是否遵循最佳做法,因为我仍然试图了解所有这些协议的详细信息。