将NSSet转换为Swift数组

时间:2014-06-26 05:13:58

标签: core-data swift ios8

在CoreData中,我定义了一个无序到多个关系。这种关系在Swift中定义如下:

@NSManaged var types : NSMutableSet

但是,要使用Swift最好,我想使用像Type[]这样的普通Swift数组。但是,CoreData强迫我使用NS(Mutable)Set。如何将NSSet输入/转换为Array<Type>[]

6 个答案:

答案 0 :(得分:74)

var set = NSSet() //NSSet
var arr = set.allObjects //Swift Array
var nsarr = set.allObjects as NSArray  //NSArray

答案 1 :(得分:44)

从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)

答案 2 :(得分:8)

从Xcode 7.2 / Swift 2.1开始,这个答案已经过时了。请参阅已接受的答案以获取更新的答案。


我目前正在使用obj.types.allObjects as Type[],但这感觉就像是黑客/解决方法。

答案 3 :(得分:3)

我就这样做了:

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

然后你可以正常操作数组:

for item in array { id = item.id }

答案 4 :(得分:3)

使用map获取如下数组:

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

...
let myArray: [MyType] = set.toArray()

答案 5 :(得分:2)

您还可以使用.sortedArray对元素进行排序。

斯威夫特3:

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

对于字符串,请在#selector调用中使用NSString.compare。