在CoreData中,我定义了一个无序到多个关系。这种关系在Swift中定义如下:
@NSManaged var types : NSMutableSet
但是,要使用Swift最好,我想使用像Type[]
这样的普通Swift数组。但是,CoreData强迫我使用NS(Mutable)Set
。如何将NSSet
输入/转换为Array<Type>[]
?
答案 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。