In diesem Fall sollte die einfache Lösung von Antonio verwendet werden. Ich würde das gerne noch ein wenig diskutieren. Wenn wir versuchen, eine Instanz von 'NSMutableOrderedSet'
in einer 'for'
Schleife aufzuzählen, wird der Compiler beschweren:
error: type 'NSMutableOrderedSet' does not conform to protocol 'SequenceType'
Wenn wir
for element in sequence {
// do something with element
}
der Compiler schreibt sie in so etwas schreiben:
var generator = sequence.generate()
while let element = generator.next() {
// do something with element
}
'NS(Mutable)OrderedSet'
hat keine 'generate()'
Methode dh es entspricht nicht dem 'SequenceType'
Protokoll. Das können wir ändern. Zunächst müssen wir einen Generator:
public struct OrderedSetGenerator : GeneratorType {
private let orderedSet: NSMutableOrderedSet
public init(orderedSet: NSOrderedSet) {
self.orderedSet = NSMutableOrderedSet(orderedSet: orderedSet)
}
mutating public func next() -> AnyObject? {
if orderedSet.count > 0 {
let first: AnyObject = orderedSet.objectAtIndex(0)
orderedSet.removeObjectAtIndex(0)
return first
} else {
return nil
}
}
}
Jetzt können wir diesen Generator verwenden, um 'NSOrderedSet'
entsprechen 'SequenceType'
:
extension NSOrderedSet : SequenceType {
public func generate() -> OrderedSetGenerator {
return OrderedSetGenerator(orderedSet: self)
}
}
'NS(Mutable)OrderedSet'
können nun in einer 'for'
Schleife verwendet werden:
let sequence = NSMutableOrderedSet(array: [2, 4, 6])
for element in sequence {
println(element) // 2 4 6
}
Wir könnten 'CollectionType'
und 'MutableCollectionType'
weiter implementieren (letzteres nur für 'NSMutableOrderedSet'
) t o make 'NS(Mutable)OrderedSet'
verhalten sich wie Swift's Standard-Bibliothekssammlungen.
Nicht sicher, ob der obige Code den Best Practices folgt, da ich immer noch versuche, Details zu all diesen Protokollen zu verstehen.