swift - Iterando sobre un NSOrderedSet
(3)
Estoy tratando de iterar sobre una instancia de NSOrderedSet. Algo como esto:
func myFunc() {
var orderedSet = NSOrderedSet(array: [ 42, 43, 44])
for n in orderedSet {
NSLog("%i", n)
}
}
... sin embargo, la línea de bucle for produce este error de compilación:
''NSOrderedSet'' does not have a member named ''Generator''
Ahora podría convertirlo en una matriz como esta:
for n in orderedSet.array {
NSLog("%i", n)
}
... pero me preguntaba si habría una mejor solución?
También me interesa entender por qué es posible iterar sobre un conjunto pero no un conjunto ordenado. NSOrderedSet
implementa NSFastEnumeration
, por lo que debería funcionar, ¿no?
La solución Swifty, más simple y más general sería copiar en una matriz en O (1), según los documentos. Esto le permitiría utilizar otras técnicas y funciones funcionales de 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)")
}
Más simple, más accesible, O (1) rendimiento: copia superficial a matriz:
0 1 2 3 4 5 6 7
En general, para otros tipos y casos, puede crear una secuencia:
0 1 2 3 4 5 6 7
Puedes iterar sobre un conjunto ordenado con
let orderedSet = NSOrderedSet(array: [ 42, 43, 44])
orderedSet.enumerateObjectsUsingBlock { (elem, idx, stop) -> Void in
println("/(idx): /(elem)")
}
ACTUALIZACIÓN: A partir de Swift 1.2 (Xcode 6.3), NSOrderedSet
ajusta a SequenceType
y se puede enumerar con for ... in ...
:
let orderedSet = NSOrderedSet(array: [ 42, 43, 44])
for elem in orderedSet {
println(elem)
}
NSOrderedSet
no se ajusta a SequenceType
. NSOrderedSet
es una subclase de NSObject
y no NSSet
como uno podría imaginar. Supongo que los ingenieros de Apple lo pasaron por alto.