swift nsorderedset

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.