Core data 将NSSet转换为Swift数组
在CoreData中,我定义了一个无序到多的关系。该关系在Swift中定义如下:Core data 将NSSet转换为Swift数组,core-data,swift,ios8,Core Data,Swift,Ios8,在CoreData中,我定义了一个无序到多的关系。该关系在Swift中定义如下: @NSManaged var types : NSMutableSet extension NSSet { func toArray<T>() -> [T] { let array = self.map({ $0 as! T}) return array } } ... let myArray: [MyType] = set.toArray() 然而,为了最好地使用S
@NSManaged var types : NSMutableSet
extension NSSet {
func toArray<T>() -> [T] {
let array = self.map({ $0 as! T})
return array
}
}
...
let myArray: [MyType] = set.toArray()
然而,为了最好地使用Swift,我想使用一个普通的Swift数组,比如
Type[]
。但是,CoreData强制我使用NS(可变)集合
。如何将NSSet
转换为Array[]
?此答案在Xcode 7.2/Swift 2.1中已经过时。有关更新的答案,请参阅已接受的答案
我目前正在使用
obj.types.allObjects作为类型[]
,但这感觉像是一种黑客/解决方法。从Xcode 7.2和Swift 2.1.1开始
事实上,我通过试验发现:
@NSManaged var types : Set<Type>
从编辑器创建NSManagedObject
子类时。所以我想知道是否有一种不太详细的方法可以在不强制转换的情况下使用filter
方法。但是Swift应该能够自动在NSSet、NSArray和他们的对手之间架起桥梁。所以我试着直接将它声明为一个集合,它是有效的
回答这个问题时,将其转换为数组变得很简单:
Array(types)
您还可以使用.sortedArray对元素进行排序 Swift 3:
yourNSSetType?.sortedArray(using: [NSSortDescriptor(key: "keyToSortBy", ascending: true, selector: #selector(NSNumber.compare(_:)))]) as! [yourNSSetType]
对于字符串,请在#选择器调用中使用NSString.compare。我就是这样做的:
` let array = object.NSSet?.allObjects as! [ArrayType] `
然后可以像正常操作一样操作阵列:
数组中项目的{
id=item.id
}
使用map获得如下数组:
@NSManaged var types : NSMutableSet
extension NSSet {
func toArray<T>() -> [T] {
let array = self.map({ $0 as! T})
return array
}
}
...
let myArray: [MyType] = set.toArray()
扩展NSSet{
func toArray()->[T]{
让array=self.map({$0as!T})
返回数组
}
}
...
让myArray:[MyType]=set.toArray()
类型转换的可能重复项是不可能的,因为NSSet不继承NSArray,但您可以使用
类型转换为NSArray。allObjects()
@ColinE它不是重复项,因为您所指的是关于NSArray的,这是关于NSSet的。不同的类型,不同的问题,可能不同的答案。是的,这是重复的,因为NSSet
可以转换为NSArray
,并且从那一点来看,解决方案是相同的。@bouke,Swift文档介绍了有关Cocoa类型的以下内容:Swift自动在Array
类型和NSArray
类之间建立桥梁,并且(…)在Swift代码中,可以将Array
值传递给需要NSArray
对象的方法。您还可以在桥接类型和对应类型之间进行强制转换。我想这是非常清楚的声明,来源:,欢迎您!虽然这个答案仍然有效,但Swift 1.2现在还包含一个本机Set
结构。Set
没有allObjects
,但支持数组支持的(大多数)操作。因此,无需将NSSet转换为数组。这确实帮助了我的collectionview-我使用它允许CoreData NSSet通过indexpath.row驱动我的collectionview来扩展@bouke发布的评论,你可以将SwiftSet
转换为array
就像let array=array(mySet)
没关系,伙计,在Swift 1.2中,将引入本机集合
,因此暂时可以解决问题。从Xcode 7开始,Swift 2。CoreData stil使用的是NSSet
,因此这个set till需要转换为本机数组或本机集。@SwiftArchitect实际上,从Xcode 7.2开始(我还没有尝试过其他版本),如果您像我在回答中解释的那样直接声明为本机set
,它就可以工作了。谢谢您提供的详细信息+1.您可能希望在回答中具体说明Xcode版本。核心数据使用NSSet优化引擎盖下的内容。使用Set可能会降低内存效率,即使人体工程学更好。