遍历一个 NSOrderedSet
Posted
技术标签:
【中文标题】遍历一个 NSOrderedSet【英文标题】:Iterating over an NSOrderedSet 【发布时间】:2014-10-28 08:22:51 【问题描述】:我正在尝试遍历 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
,所以它应该可以正常工作吗?
【问题讨论】:
【参考方案1】:你可以遍历一个有序集合
let orderedSet = NSOrderedSet(array: [ 42, 43, 44])
orderedSet.enumerateObjectsUsingBlock (elem, idx, stop) -> Void in
println("\(idx): \(elem)")
更新: 从 Swift 1.2 (Xcode 6.3) 开始,NSOrderedSet
符合
SequenceType
,可以用for ... in ...
枚举:
let orderedSet = NSOrderedSet(array: [ 42, 43, 44])
for elem in orderedSet
println(elem)
【讨论】:
太棒了——我喜欢 ***;问一个幼稚的问题并在几分钟内获得两个有用的帖子,其中一个为问题提供了一个全面更好的解决方案。接受这个答案。感谢您的帮助。【参考方案2】:NSOrderedSet
不符合 SequenceType
。 NSOrderedSet
是 NSObject
的子类,而不是可以想象的 NSSet
。我猜苹果工程师忽略了它。
【讨论】:
是的,NSOrderedSet 实现 SequenceType 是有道理的,+1。【参考方案3】:根据文档,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
【讨论】:
以上是关于遍历一个 NSOrderedSet的主要内容,如果未能解决你的问题,请参考以下文章