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
を実装しているので、正しく機能しますか?
順序集合を反復処理できます
let orderedSet = NSOrderedSet(array: [ 42, 43, 44])
orderedSet.enumerateObjectsUsingBlock { (elem, idx, stop) -> Void in
println("\(idx): \(elem)")
}
PDATE: Swift 1.2(Xcode 6.3)以降、NSOrderedSet
はSequenceType
に準拠し、for ... in ...
で列挙できます。
let orderedSet = NSOrderedSet(array: [ 42, 43, 44])
for elem in orderedSet {
println(elem)
}
NSOrderedSet
はSequenceType
に準拠していません。 NSOrderedSet
はNSObject
のサブクラスであり、想像できるようにNSSet
ではありません。 Appleエンジニアはそれを見落としていたと思います。
迅速で、最も単純で、最も一般的な解決策は、ドキュメントごとに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