我如何将一个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]