遍历一个 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 不符合 SequenceTypeNSOrderedSetNSObject 的子类,而不是可以想象的 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的主要内容,如果未能解决你的问题,请参考以下文章

c# 设计一个遍历一个类所有enum的方法

php 怎么反向遍历一个数组

lua 如何遍历一个字符串

二叉树遍历技巧

Java:根据前序遍历与中序遍历构造出一个二叉树

JAVA中遍历JSONObject不能按原顺序遍历