CoreDataでnordered対多の関係を定義しました。この関係はSwiftのように定義されています:
_@NSManaged var types : NSMutableSet
_
ただし、Swift=最高の状態で使用するには、通常のSwift _Type[]
_のような配列を使用します。ただし、CoreDataではNS(Mutable)Set
。NSSet
を_Array<Type>[]
_に型キャスト/変換するにはどうすればよいですか?
Xcode 7.2以降Swift 2.1.1
実際、私は裁判で次のことを発見しました:
@NSManaged var types : Set<Type>
完璧に動作します。
実際、CoreDataは次のような考え方を生成します。
@NSManaged var types : NSSet
エディターからNSManagedObject
サブクラスを作成するとき。したがって、キャストせずにfilter
メソッドを使用するあまり冗長でないメソッドがあるのではないかと思っていました。ただし、SwiftはNSSet、NSArray、およびそれらの対応物の間を自動的にブリッジすることになっています。したがって、Setとして直接宣言してみました。
質問に答えて、配列に変換するのは簡単です:
Array(types)
var set = NSSet() //NSSet
var arr = set.allObjects //Swift Array
var nsarr = set.allObjects as NSArray //NSArray
この答えは、Xcode 7.2/Swift 2.1では時代遅れです。更新された回答については、受け入れられた回答を参照してください。
現在obj.types.allObjects as Type[]
を使用していますが、それはハック/回避策のように感じます。
これは私がそれをやった方法です:
` let array = object.NSSet?.allObjects as! [ArrayType] `
その後、通常どおり配列を操作できます。
for item in array { id = item.id }
Mapを使用して、次のような配列を取得します。
extension NSSet {
func toArray<T>() -> [T] {
let array = self.map({ $0 as! T})
return array
}
}
...
let myArray: [MyType] = set.toArray()
.sortedArrayを使用して要素を並べ替えることもできます。
スウィフト3:
yourNSSetType?.sortedArray(using: [NSSortDescriptor(key: "keyToSortBy", ascending: true, selector: #selector(NSNumber.compare(_:)))]) as! [yourNSSetType]
文字列の場合、#selector呼び出しでNSString.compareを使用します。