web-dev-qa-db-ja.com

NSSetをSwift配列に変換

CoreDataでnordered対多の関係を定義しました。この関係はSwiftのように定義されています:

_@NSManaged var types : NSMutableSet
_

ただし、Swift=最高の状態で使用するには、通常のSwift _Type[]_のような配列を使用します。ただし、CoreDataではNS(Mutable)SetNSSetを_Array<Type>[]_に型キャスト/変換するにはどうすればよいですか?

45
Bouke

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)
47
FranMowinckel
var set = NSSet() //NSSet
var arr = set.allObjects //Swift Array
var nsarr = set.allObjects as NSArray  //NSArray
75
Connor

この答えは、Xcode 7.2/Swift 2.1では時代遅れです。更新された回答については、受け入れられた回答を参照してください。


現在obj.types.allObjects as Type[]を使用していますが、それはハック/回避策のように感じます。

8
Bouke

これは私がそれをやった方法です:

` let array = object.NSSet?.allObjects as! [ArrayType] `

その後、通常どおり配列を操作できます。

for item in array { id = item.id }

3
Daniel

Mapを使用して、次のような配列を取得します。

extension NSSet {
  func toArray<T>() -> [T] {
    let array = self.map({ $0 as! T})
    return array
  }
}

...
let myArray: [MyType] = set.toArray()
3
David.Chu.ca

.sortedArrayを使用して要素を並べ替えることもできます。

スウィフト3:

yourNSSetType?.sortedArray(using: [NSSortDescriptor(key: "keyToSortBy", ascending: true, selector: #selector(NSNumber.compare(_:)))]) as! [yourNSSetType]

文字列の場合、#selector呼び出しでNSString.compareを使用します。

2
mcfroob