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