Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Core data 将NSArray转换为Swift阵列<;T>;_Core Data_Swift_Ios8 - Fatal编程技术网

Core data 将NSArray转换为Swift阵列<;T>;

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

在CoreData中,我定义了一个有序到多的关系。该关系在Swift中定义如下:

@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,仍然需要强制转换才能正确使用映射函数。在我看来,迭代数组以将其复制到新数组并不十分优雅。即使我知道数组中的所有实例都是相同类型的,这是最简单的解决方案吗?