将NSArray转换为Swift Array<T>

32
在CoreData中,我定义了一个有序的一对多关系。这个关系在Swift中像这样定义:

在CoreData中,我定义了一个有序的一对多关系。这个关系在Swift中如下所示:

@NSManaged var types : NSMutableArray

然而,为了最好地使用Swift,我想使用普通的Swift数组,例如Type[]。但是,CoreData强制我使用NS(Mutable)Array。如何将NSArray转换为Array<Type>[]

显然,混淆是由以下错误引起的:

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

据我所知,有序关系应该由NSOrderedSet表示,而不是NSMutableArray。 - Martin R
2
我目前使用的是 obj.types.allObjects 作为 Type[],但感觉像是一个hack/解决方法。不,那就是将NSArray转换为特定类型的Swift数组的方式。 - matt
1
哇,为什么会有负评?我也有同样的问题,似乎值得问一下。 - davidethell
4个回答

16
我目前正在使用obj.types.allObjects as Type[],但感觉像是一个hack/临时解决方法。
然后改变你的想法。你所做的正是如何“类型转换/将NSArray转换为Array<Type>[]。”
无论何时,在Swift中,NSArray始终作为包含AnyObject(即Array<AnyObject>,又称AnyObject[])到达。 如果你知道它包含所有一种类型,则将其下转型为特定类型由你自己确定,而您所做的就是您应该做的事情。
编辑:在Swift 2.0和新的iOS 9 API中,NSArray通常会正确地到达,并且不需要转换。
编辑2:在Swift 3.0中,未正确类型化的NSArray(虽然不太常见)将到达,其中包含Any而不是AnyObject,仍需要向下转换为特定类型。

那个“变通方法”对于NSArray无效,但对于NSSet有效。所以我仍在寻找一个好的解决方案。 - Bouke
1
它适用于数组 - allObjects 是 NSSet 上返回所有元素作为数组的方法。 - Grady Player
承认,我期望在NSArray上有一个allObjects; 但是NSArray本身可以被转换为Array。然而,我仍然不清楚为什么需要两个转换,请参见我的更新问题。 - Bouke
1
使用Swift 2.2,为了正确使用map函数仍然需要进行类型转换。 - Vivek Gani

2
以下是我项目中的一个可用代码片段,可能会有所帮助?
if let rawArray = rawData as? NSArray,
   let castArray = rawArray as? Array< Dictionary< String, AnyObject > >
   { 
       // etc... 
   }

它能够工作,尽管我不确定它是否被认为是最佳选择。


1

用这种方式列举它们:

for type in types.array {
    // Do something
}

或者简单地使用您正在使用的NSOrderedSetarray属性,如下所示:

types.array

0

你需要创建一个新的通用数组,并手动按以下方式填充它:

    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)
        }
    }

1
遍历数组将其复制到一个新的数组中似乎不是很优雅。即使我知道数组中所有实例都是相同类型,这是否是最简单的解决方案? - Bouke

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接