web-dev-qa-db-ja.com

NSOrderedSetを反復処理します

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)
    }

...しかし、もっと良い解決策があるかどうか疑問に思いましたか?

また、順序集合ではなくセットを反復処理できる理由を理解したいと思っています。 NSOrderedSetNSFastEnumerationを実装しているので、正しく機能しますか?

18
Andrew Ebling

順序集合を反復処理できます

let orderedSet = NSOrderedSet(array: [ 42, 43, 44])
orderedSet.enumerateObjectsUsingBlock { (elem, idx, stop) -> Void in
    println("\(idx): \(elem)")
}

PDATE: Swift 1.2(Xcode 6.3)以降、NSOrderedSetSequenceTypeに準拠し、for ... in ...で列挙できます。

let orderedSet = NSOrderedSet(array: [ 42, 43, 44])
for elem in orderedSet {
    println(elem)
}
41
Martin R

NSOrderedSetSequenceTypeに準拠していません。 NSOrderedSetNSObjectのサブクラスであり、想像できるようにNSSetではありません。 Appleエンジニアはそれを見落としていたと思います。

2
Kirsteins

迅速で、最も単純で、最も一般的な解決策は、ドキュメントごとに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

2
Chris Conover