2014-11-22 6 views

risposta

18

È possibile ottenere una rappresentazione serie di set tramite la proprietà array - allora si può downcast al tipo e assegnare ad una variabile:

let families = p.fathers.array as [Family] 

ma ovviamente puoi anche utilizzarlo direttamente nel ciclo:

for f in p.fathers.array as [Family] { 
    .... 
} 
2

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.