私はこれを for ループにしています。これpは関係なのでNSManagedObject、にキャストする必要がありますが、うまくいきません。なぜですか?fathersto-manyNSMutableOrderedSet[Family]
for f in p.fathers as [Family] {
}

私はこれを for ループにしています。これpは関係なのでNSManagedObject、にキャストする必要がありますが、うまくいきません。なぜですか?fathersto-manyNSMutableOrderedSet[Family]
for f in p.fathers as [Family] {
}

プロパティを介してセットの配列表現を取得できarrayます。次に、それを適切な型にダウンキャストして、変数に割り当てることができます。
let families = p.fathers.array as [Family]
もちろん、ループ内で直接使用することもできます。
for f in p.fathers.array as [Family] {
....
}
アップデート
演算子を使用して強制ダウンキャストが必要!になったため、上記のコードは次のようになります。
let families = p.fathers.array as! [Family]
この場合、 Antonioによる単純なソリューションを使用する必要があります。これについてもう少し議論したいと思います。'NSMutableOrderedSet'ループ内でのインスタンスを列挙しようとすると'for'、コンパイラは次のように文句を言います。
エラー: タイプ 'NSMutableOrderedSet' はプロトコル 'SequenceType' に準拠していません
書くとき
for element in sequence {
// do something with element
}
コンパイラはそれを次のように書き換えます。
var generator = sequence.generate()
while let element = generator.next() {
// do something with element
}
'NS(Mutable)OrderedSet''generate()'メソッドがありません。つまり、プロトコルに準拠していません'SequenceType'。私たちはそれを変えることができます。まず、ジェネレーターが必要です:
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
}
}
}
これで、そのジェネレーターを使用して に'NSOrderedSet'準拠させることができます'SequenceType':
extension NSOrderedSet : SequenceType {
public func generate() -> OrderedSetGenerator {
return OrderedSetGenerator(orderedSet: self)
}
}
'NS(Mutable)OrderedSet''for'ループで使用できるようになりました:
let sequence = NSMutableOrderedSet(array: [2, 4, 6])
for element in sequence {
println(element) // 2 4 6
}
'CollectionType'and 'MutableCollectionType'(後者'NSMutableOrderedSet'のみ) をさらに実装して、 'NS(Mutable)OrderedSet'Swift の標準ライブラリ コレクションのように動作させることができます。
上記のコードがベスト プラクティスに従っているかどうかはわかりませんが、これらすべてのプロトコルの詳細についてはまだ頭を悩ませているところです。