ios – 如何将NSMutableArray转换为特定类型的Swift数组?

我正在将我的iOS项目迁移到Swift。我正在做这个类的类。当我从Swift调用Objective C方法时,很多Objective C类型被转换为它们的Swift对象。

在我的情况下,一个Objective C NSMutableArray被转换为Swift的数组< AnyObject&gt ;.现在这里来我的问题。在我的Swift类中,我从Objective C对象中获取这样的数组。现在我在Swift世界中,我想把这个数组转换为一个特定的类型,而不是AnyObject,因为我知道这个数组中存在什么样的对象。 编译器不会让我这样做!让我简化我的问题,说我想转换到一个包含字符串的数组。这是我试过:

var strings = myObjcObject.getStrings() as [String]

我从编译器得到以下错误:

‘String’ is not identical to ‘AnyObject’

我必须同意编译器,因为String确实不等同于AnyObject。但我不明白为什么这是一个问题。我可以downcast AnyObject到String如果我想,对不对?

我也试过:

var strings = myObjcObject.getStrings() as? [String]

这似乎是一个正确的方向一步,但getStrings()返回一个NSMutableArray,所以我得到以下错误:

‘NSArray’ is not a subtype of ‘NSMutableArray’

有什么办法做我想在这里做的事吗?

最佳答案
你可以使这个工作与双向下降,首先到NSArray,然后到[String]:

var strings = myObjcObject.getStrings() as NSArray as [String]

在游乐场测试与:

import Foundation

var objCMutableArray = NSMutableArray(array: ["a", "b", "c"])
var swiftArray = objCMutableArray as NSArray as [String]

更新:

在更高版本的Swift(至少1.2)中,编译器将抱怨为[String]。相反,你应该使用一个if let with一个有条件的downcast作为?:

import Foundation

var objCMutableArray = NSMutableArray(array: ["a", "b", "c"])
if let swiftArray = objCMutableArray as NSArray as? [String] {
    // Use swiftArray here
}

如果你绝对确定你的NSMutableArray可以转换为[String],那么你可以使用as! (但你可能不应该在大多数情况下使用):

import Foundation

var objCMutableArray = NSMutableArray(array: ["a", "b", "c"])
var swiftArray = objCMutableArray as NSArray as! [String]

转载注明原文:ios – 如何将NSMutableArray转换为特定类型的Swift数组? - 代码日志