In questo caso è consigliabile utilizzare la soluzione semplice Antonio. Vorrei solo discuterne un po 'di più. Se cerchiamo di elencare un'istanza di 'NSMutableOrderedSet'
in un ciclo 'for'
, il compilatore si lamenta:
error: type 'NSMutableOrderedSet' does not conform to protocol 'SequenceType'
Quando scriviamo
for element in sequence {
// do something with element
}
il compilatore riscrive in qualcosa di simile:
var generator = sequence.generate()
while let element = generator.next() {
// do something with element
}
'NS(Mutable)OrderedSet'
non ha il metodo 'generate()'
, ovvero non è conforme al protocollo 'SequenceType'
. Possiamo cambiarlo. In primo luogo abbiamo bisogno di un generatore:
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
}
}
}
Ora possiamo usare quel generatore per fare 'NSOrderedSet'
conformarsi alle 'SequenceType'
:
extension NSOrderedSet : SequenceType {
public func generate() -> OrderedSetGenerator {
return OrderedSetGenerator(orderedSet: self)
}
}
'NS(Mutable)OrderedSet'
può ora essere utilizzato in un 'for'
ciclo:
let sequence = NSMutableOrderedSet(array: [2, 4, 6])
for element in sequence {
println(element) // 2 4 6
}
Potremmo implementare ulteriormente 'CollectionType'
e 'MutableCollectionType'
(quest'ultimo solo per 'NSMutableOrderedSet'
) t o fare in modo che 'NS(Mutable)OrderedSet'
si comporti come le raccolte di librerie standard di Swift.
Non sono sicuro che il codice sopra riportato segua le migliori pratiche poiché sto ancora cercando di comprendere i dettagli di tutti questi protocolli.
fonte
2014-11-22 12:48:01