Core data 将NSArray转换为Swift阵列<;T>;
在CoreData中,我定义了一个有序到多的关系。该关系在Swift中定义如下:Core data 将NSArray转换为Swift阵列<;T>;,core-data,swift,ios8,Core Data,Swift,Ios8,在CoreData中,我定义了一个有序到多的关系。该关系在Swift中定义如下: @NSManaged var types : NSMutableArray 然而,为了最好地使用Swift,我想使用一个普通的Swift数组,比如Type[]。但是,CoreData强制我使用NS(可变)数组。如何将NSArray转换为Array[] 显然,混淆源于以下错误: let array = obj.types as T[] // Cannot convert expression's type 'Nod
@NSManaged var types : NSMutableArray
然而,为了最好地使用Swift,我想使用一个普通的Swift数组,比如Type[]
。但是,CoreData强制我使用NS(可变)数组
。如何将NSArray
转换为Array[]
显然,混淆源于以下错误:
let array = obj.types as T[] // Cannot convert expression's type 'Node[]' to type '$T2'
尽管编辑接受了这一点:
let array = obj.types as AnyObject[] as T[] // No complaint
您必须创建一个新的通用数组,并按如下方式手动填充它:
var result = Type[]()
for item : AnyObject in self {
// Keep only objC objects compatible with OutType
if let converted = bridgeFromObjectiveC(item, Type.self) {
result.append(converted)
}
}
我目前正在使用obj.types.allObjects作为类型[]
,但这感觉像是一种破解/解决方法
然后改变你的感觉。您所做的正是如何“将NSArray
类型转换为Array[]
”
NSArray总是以包含任何对象
(即数组
,又称任何对象[]
)的形式到达Swift。如果您知道它包含所有一种类型,那么将其向下转换为一种特定类型取决于您,您应该如何操作它
编辑在Swift 2.0和新的iOS 9 API中,NSArray通常会正确输入,无需强制转换
编辑2在Swift 3.0中,键入不正确的NSArray(尽管不常见)将作为包含
任何而不是任何对象的NSArray到达,并且仍然必须向下转换为特定类型。以这种方式列举它们:
for type in types.array {
// Do something
}
或者只需使用您正在使用的传感器数据集
的数组
属性,如下所示:
types.array
下面是我的一个项目中的一段代码,可能会有所帮助
if let rawArray = rawData as? NSArray,
let castArray = rawArray as? Array< Dictionary< String, AnyObject > >
{
// etc...
}
如果让rawArray=rawData作为?恩萨雷,
让castArray=rawArray作为?数组>
{
//等等。。。
}
它是有效的,尽管我不确定它是否会被认为是最佳的。有序关系(据我所知)是由SensorDeredSet表示的,而不是由NSMutableArray表示的。“我目前使用obj.types.allObjects作为类型[],但这感觉像是一种破解/解决方法。”。不,这就是你如何向特定类型的Swift数组投出NSArray的方法。哇,为什么投反对票?我也有同样的问题,这似乎值得一提。这种“变通方法”对NSArray无效,但对NSSet有效。所以我仍然在寻找一个很好的解决方案。它对数组是有效的-AllObject是NSSet上的一个方法,它以数组的形式返回所有元素;但是NSArray本身可以被铸造成一个数组。但是,我仍然不清楚为什么需要两个强制转换,请参见我的更新问题。使用swift 2.2,仍然需要强制转换才能正确使用映射函数。在我看来,迭代数组以将其复制到新数组并不十分优雅。即使我知道数组中的所有实例都是相同类型的,这是最简单的解决方案吗?