我如何将一个NSMutableArray转换为特定types的Swift数组?
我正在将我的iOS项目迁移到Swift。 我正在按class上课。 当我从Swift调用Objective C方法时,很多Objective Ctypes被转换为Swift对象。
在我的情况下,Objective C NSMutableArray
被转换为Swift的Array<AnyObject>
。 现在这里出现我的问题。 在我的Swift类中,我从一个Objective C对象中得到了一个这样的数组。 现在我在Swift世界中,我想将这个数组转换成一个特定的types,而不是AnyObject
,因为我知道这个数组中存在着什么types的对象。
编译器不会让我这样做! 让我简化我的问题,说我想转换为包含string的数组。 这是我试过的:
var strings = myObjcObject.getStrings() as [String]
我从编译器得到以下错误:
'String'与'AnyObject'不一样
我不得不同意编译器,因为String确实与AnyObject不相同。 但我不明白为什么这是一个问题。 如果需要,我可以将AnyObject转换为String,对吧?
我也试过:
var strings = myObjcObject.getStrings() as? [String]
这似乎是在正确的方向迈出的一步,但getStrings()返回一个NSMutableArray
所以我得到以下错误:
“NSArray”不是“NSMutableArray”的子types
有什么办法可以做我想在这里做的?
您可以使用双向downcast,首先到NSArray
,然后到[String]
:
var strings = myObjcObject.getStrings() as NSArray as [String]
在游乐场testing与:
import Foundation var objCMutableArray = NSMutableArray(array: ["a", "b", "c"]) var swiftArray = objCMutableArray as NSArray as [String]
更新:
在更高版本的Swift(至less1.2)中,编译器会抱怨as [String]
。 相反,你应该使用一个if let
条件downcast 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]
flatMap
是Swift 2.x(&above)中的朋友:
let mutableArray = NSMutableArray(array: ["a", "b", "c"]) let swiftArray: [String] = mutableArray.flatMap({ $0 as? String })
没有双重或强制铸造。
随着Swift 1.2以下将工作:
let mutableArray = NSMutableArray(array: ["a", "b", "c"]) let swiftArray = NSArray(array: mutableArray) as? [String]
let mutableArray = NSMutableArray() mutableArray.addObject("Abc") mutableArray.addObject("def") mutableArray.addObject("ghi") if let myStringArray = mutableArray.objectEnumerator().allObjects as? [String] { println(myStringArray) // "[Abc, def, ghi]" }
在Xcode 6.3中,我使用了以下内容:
var mutableArray = NSMutableArray(array:"1", "2", "3") let swiftArray = mutableArray as AnyObject as! [String]
为迅速3
你可以考虑下面的代码
let array: [String] = nsMutableArrayObject.copy() as! [String]