我正在将我的iOS项目迁移到Swift。我每节课都在做这个课。当我从Swift中调用目标C方法时,许多目标C类型被转换为它们的Swift方法。
在我的例子中,目标C NSMutableArray
被转换为Swift的Array<AnyObject>
。现在我的问题来了。在我的Swift类中,我从一个目标C对象得到这样一个数组。现在我在Swift世界中,我想把这个数组转换成一个特定的类型,而不是AnyObject
,因为我确实知道这个数组中存在什么样的对象。
编译器不会让我这么做的!让我简化我的问题,说我想转换成一个包含字符串的数组。这就是我试过的:
var strings = myObjcObject.getStrings() as [String]
我从编译器得到以下错误:
‘'String’和'AnyObject‘不一样
我必须同意编译器的意见,因为字符串确实与AnyObject不完全相同。但我不明白为什么这是个问题。如果我想的话,我可以让AnyObject下线,对吗?
我也试过:
var strings = myObjcObject.getStrings() as? [String]
这似乎是朝着正确方向迈出的一步,但是getStrings()返回一个NSMutableArray
,因此我得到以下错误:
'NSArray‘不是'NSMutableArray’的一个子类型
有办法做我在这里想做的事吗?
发布于 2014-09-14 20:30:05
您可以通过双下播来完成这个工作,首先是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)中,编译器会抱怨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
}
如果您是绝对确信您的NSMutableArray
可以转换为[String]
,那么您可以使用as!
(但在大多数情况下您可能不应该使用它):
import Foundation
var objCMutableArray = NSMutableArray(array: ["a", "b", "c"])
var swiftArray = objCMutableArray as NSArray as! [String]
发布于 2016-01-21 14:35:07
compactMap
是斯威夫特4.1及以上的朋友,也是斯威夫特3.3-3.4的朋友.这意味着你没有任何双重或强制铸造。
let mutableArray = NSMutableArray(array: ["a", "b", "c"])
let swiftArray: [String] = mutableArray.compactMap { $0 as? String }
在Swift、2.03.2和4.0的早期版本中,您将希望为此目的使用flatMap
。用法与compactMap
相同
let swiftArray: [String] = mutableArray.flatMap { $0 as? String }
发布于 2015-03-13 23:29:42
使用Swift 1.2,以下内容将有效:
let mutableArray = NSMutableArray(array: ["a", "b", "c"])
let swiftArray = NSArray(array: mutableArray) as? [String]
https://stackoverflow.com/questions/25837539
复制相似问题