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

Tom*_*ren 66 objective-c ios swift

我正在将我的iOS项目迁移到Swift.我是按班做的.当我从Swift调用Objective C方法时,许多Objective C类型被转换为它们的Swift对应物.

在我的例子中,Objective C NSMutableArray被转换为Swift的Array<AnyObject>.现在我的问题来了.在我的Swift类中,我从Objective C对象中获取了这样一个数组.既然我在Swift世界中,我想将这个数组转换为特定类型而不是AnyObject,因为我确定这个数组中存在什么样的对象.

编译器不会让我这样做!让我通过说我想要转换为包含字符串的数组来简化我的问题.这是我试过的:

var strings = myObjcObject.getStrings() as [String]
Run Code Online (Sandbox Code Playgroud)

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

'String'与'AnyObject'不同

我必须同意编译器,因为String确实与AnyObject不同.但我不明白为什么这是一个问题.如果我愿意,我可以将AnyObject转发给String,对吧?

我也尝试过:

var strings = myObjcObject.getStrings() as? [String]
Run Code Online (Sandbox Code Playgroud)

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

'NSArray'不是'NSMutableArray'的子类型

有没有办法做我想在这里做的事情?

Mik*_*e S 129

您可以使用双向下转换,首先执行此操作NSArray,然后执行以下操作[String]:

var strings = myObjcObject.getStrings() as NSArray as [String]
Run Code Online (Sandbox Code Playgroud)

在游乐场测试:

import Foundation

var objCMutableArray = NSMutableArray(array: ["a", "b", "c"])
var swiftArray = objCMutableArray as NSArray as [String]
Run Code Online (Sandbox Code Playgroud)

更新:

在Swift的后续版本(至少1.2)中,编译器会抱怨as [String].相反,你应该使用if let带有条件的向下转换as?:

import Foundation

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

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

import Foundation

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


Sim*_*ice 34

compactMap是你在Swift 4.1及以上版本的朋友,以及Swift 3.3-3.4中的朋友.这意味着您没有任何双重或强制转换.

let mutableArray = NSMutableArray(array: ["a", "b", "c"])
let swiftArray: [String] = mutableArray.compactMap { $0 as? String }
Run Code Online (Sandbox Code Playgroud)

在以前版本的Swift,2.0-3.2和4.0中,您将希望flatMap用于此目的.用法与compactMap:

let swiftArray: [String] = mutableArray.flatMap { $0 as? String }
Run Code Online (Sandbox Code Playgroud)


ave*_*Joe 5

使用Swift 1.2,以下内容将起作用:

let mutableArray = NSMutableArray(array: ["a", "b", "c"])
let swiftArray = NSArray(array: mutableArray) as? [String]
Run Code Online (Sandbox Code Playgroud)


Leo*_*bus 5

let mutableArray = NSMutableArray()

mutableArray.add("Abc")
mutableArray.add("def")
mutableArray.add("ghi")

if let array = mutableArray as? [String] {
    print(array)    // ["Abc", "def", "ghi"]
}
Run Code Online (Sandbox Code Playgroud)