在CoreData中,我定义了一个 * 无序 * 对多关系,在Swift中定义如下:
@NSManaged var types : NSMutableSet
然而,为了最好地使用Swift,我想使用Type[]这样的普通Swift数组。然而,CoreData强制我使用NS(Mutable)Set。我如何将NSSet类型转换/转换为Array<Type>[]?
Type[]
NS(Mutable)Set
NSSet
Array<Type>[]
juud5qan1#
var set = NSSet() //NSSet var arr = set.allObjects //Swift Array var nsarr = set.allObjects as NSArray //NSArray
okxuctiv2#
实际上,我通过试验发现:
@NSManaged var types : Set<Type>
效果非常好。事实是CoreData产生了一些类似的想法:
@NSManaged var types : NSSet
当从编辑器创建NSManagedObject子类时。所以我想知道是否有一个不太冗长的方法来使用filter方法而不进行强制转换。但是Swift应该在NSSet、NSArray和它们的对应物之间自动桥接。所以我尝试直接将其声明为Set,它工作正常。回答这个问题,将其转换为Array就变得很简单了:
NSManagedObject
filter
Array(types)
wribegjk3#
我是这样做的:
let array = object.NSSet?.allObjects as! [ArrayType]
然后,您可以正常操作阵列:
for item in array { id = item.id }
wko9yo5t4#
使用map得到如下数组:
extension NSSet { func toArray<T>() -> [T] { let array = self.map({ $0 as! T}) return array } } ... let myArray: [MyType] = set.toArray()
6tdlim6h5#
此答案在Xcode 7.2/Swift 2.1中已过时。请参阅已接受的答案以获取更新的答案。我目前使用的是obj.types.allObjects as Type[],但这感觉像是一个黑客/变通方案。
obj.types.allObjects as Type[]
qmelpv7a6#
也可以使用.sortedArray对元素进行排序。雨燕3:
yourNSSetType?.sortedArray(using: [NSSortDescriptor(key: "keyToSortBy", ascending: true, selector: #selector(NSNumber.compare(_:)))]) as! [yourNSSetType]
对于字符串,请NSString.compare在#selector调用中使用www.example.com。
4dbbbstv7#
感谢@大卫的解决方案,我也遇到了同样的情况在我目前的项目中,我们仍然使用Objective C和快速桥接的核心数据模块,所以在我的情况下,我不得不使用以下代码,因为编译器无法干预要转换的泛型类型是什么,我不得不使用实际传递它:(
extension Set { func toArray<S>(_ of: S.Type) -> [S] { let array = self.map({$0 as! S}) return array } }
并使用:
Items?.toArray(XYZ.self)
在我的托管对象中;变量如下所示,以供参考
@property (nullable, nonatomic, retain) NSSet<XYZ *> * items;
7条答案
按热度按时间juud5qan1#
okxuctiv2#
实际上,我通过试验发现:
效果非常好。
事实是CoreData产生了一些类似的想法:
当从编辑器创建
NSManagedObject
子类时。所以我想知道是否有一个不太冗长的方法来使用filter
方法而不进行强制转换。但是Swift应该在NSSet、NSArray和它们的对应物之间自动桥接。所以我尝试直接将其声明为Set,它工作正常。回答这个问题,将其转换为Array就变得很简单了:
wribegjk3#
我是这样做的:
然后,您可以正常操作阵列:
wko9yo5t4#
使用map得到如下数组:
6tdlim6h5#
此答案在Xcode 7.2/Swift 2.1中已过时。请参阅已接受的答案以获取更新的答案。
我目前使用的是
obj.types.allObjects as Type[]
,但这感觉像是一个黑客/变通方案。qmelpv7a6#
也可以使用.sortedArray对元素进行排序。
雨燕3:
对于字符串,请NSString.compare在#selector调用中使用www.example.com。
4dbbbstv7#
感谢@大卫的解决方案,我也遇到了同样的情况在我目前的项目中,我们仍然使用Objective C和快速桥接的核心数据模块,所以在我的情况下,我不得不使用以下代码,因为编译器无法干预要转换的泛型类型是什么,我不得不使用实际传递它:(
并使用:
在我的托管对象中;变量如下所示,以供参考