Ján*_*nos 9 generics ios nsorderedset swift
我有这个for循环,p是一个NSManagedObject,fathers是一个to-many关系,所以我需要强制NSMutableOrderedSet转换[Family]但它不起作用,为什么?
for f in p.fathers as [Family] {
}
Run Code Online (Sandbox Code Playgroud)

Ant*_*nio 26
您可以通过array属性获取集合的数组表示- 然后您可以将其向下转换为正确的类型并分配给变量:
let families = p.fathers.array as [Family]
Run Code Online (Sandbox Code Playgroud)
但当然你也可以直接在循环中使用它:
for f in p.fathers.array as [Family] {
....
}
Run Code Online (Sandbox Code Playgroud)
在这种情况下,应使用Antonio的简单解决方案。我想再多讨论一下。如果我们尝试'NSMutableOrderedSet'在'for'循环中枚举一个实例,编译器会抱怨:
错误:类型“NSMutableOrderedSet”不符合协议“SequenceType”
当我们写
for element in sequence {
// do something with element
}
Run Code Online (Sandbox Code Playgroud)
编译器将它改写成这样:
var generator = sequence.generate()
while let element = generator.next() {
// do something with element
}
Run Code Online (Sandbox Code Playgroud)
'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
}
}
}
Run Code Online (Sandbox Code Playgroud)
现在我们可以使用该生成器来使'NSOrderedSet'符合'SequenceType':
extension NSOrderedSet : SequenceType {
public func generate() -> OrderedSetGenerator {
return OrderedSetGenerator(orderedSet: self)
}
}
Run Code Online (Sandbox Code Playgroud)
'NS(Mutable)OrderedSet'现在可以在'for'循环中使用:
let sequence = NSMutableOrderedSet(array: [2, 4, 6])
for element in sequence {
println(element) // 2 4 6
}
Run Code Online (Sandbox Code Playgroud)
我们可以进一步实现'CollectionType'和'MutableCollectionType'(后者'NSMutableOrderedSet'仅用于)使'NS(Mutable)OrderedSet'行为类似于 Swift 的标准库集合。
不确定上面的代码是否遵循最佳实践,因为我仍在尝试围绕所有这些协议的细节。
| 归档时间: |
|
| 查看次数: |
4478 次 |
| 最近记录: |