2014-11-22 4 views

Antwort

18

Sie können eine Array-Darstellung des Satzes über die array Eigenschaft erhalten - dann können Sie es auf die richtige Art niedergeschlagenen und einer Variablen zuweisen:

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

aber natürlich können Sie es auch direkt in der Schleife verwenden:

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

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.

Verwandte Themen