我正在尝试迭代NSOrderedSet的一个实例。像这样:
func myFunc() {
var orderedSet = NSOrderedSet(array: [ 42, 43, 44])
for n in orderedSet {
NSLog("%i", n)
}
}
...但是for循环行产生了这个编译器错误:
'NSOrderedSet' does not have a member named 'Generator'
现在我可以将它转换为这样的数组:
for n in orderedSet.array {
NSLog("%i", n)
}
......但我想知道是否有更好的解决方案?
我也很想理解为什么可以迭代一组而不是一个有序集? NSOrderedSet
实现了NSFastEnumeration
,所以它应该正常工作吗?
答案 0 :(得分:40)
您可以使用
迭代有序集let orderedSet = NSOrderedSet(array: [ 42, 43, 44])
orderedSet.enumerateObjectsUsingBlock { (elem, idx, stop) -> Void in
println("\(idx): \(elem)")
}
UPDATE:自Swift 1.2(Xcode 6.3)起,NSOrderedSet
符合
SequenceType
,可以使用for ... in ...
进行枚举:
let orderedSet = NSOrderedSet(array: [ 42, 43, 44])
for elem in orderedSet {
println(elem)
}
答案 1 :(得分:2)
NSOrderedSet
不符合SequenceType
。 NSOrderedSet
是NSObject
的子类,而不是NSSet
,可以想象。我猜Apple工程师忽略了它。
答案 2 :(得分:2)
Swifty,最简单,最通用的解决方案是根据文档浅层复制到O(1)中的数组。这将允许您使用Swift的其他功能技术和功能。
import Swift
import Foundation
println("Simplest, most accessible, O(1) performance: shallow copy to array:")
var set = NSOrderedSet(array: map(0...7) { d in d })
for d in set.array as [Int] {
print("\t\(d)")
}
println("\n\nIn general - for other types and cases, you could create a sequence:")
extension NSOrderedSet {
func sequenceOf<T>(t:T.Type) -> SequenceOf<T> {
var current = 0
return SequenceOf(GeneratorOf({ () -> T? in
return current < self.count ? self.objectAtIndex(current++) as? T : nil
}))
}
}
for d in set.sequenceOf(Int.self) {
print("\t\(d)")
}
最简单,最易访问,O(1)性能:浅复制到数组:
0 1 2 3 4 5 6 7
通常 - 对于其他类型和案例,您可以创建序列:
0 1 2 3 4 5 6 7