首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何将NSMutableArray转换为特定类型的Swift数组?

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

Stack Overflow用户
提问于 2014-09-14 20:10:13
回答 7查看 77.8K关注 0票数 72

我正在将我的iOS项目迁移到Swift。我每节课都在做这个课。当我从Swift中调用目标C方法时,许多目标C类型被转换为它们的Swift方法。

在我的例子中,目标C NSMutableArray被转换为Swift的Array<AnyObject>。现在我的问题来了。在我的Swift类中,我从一个目标C对象得到这样一个数组。现在我在Swift世界中,我想把这个数组转换成一个特定的类型,而不是AnyObject,因为我确实知道这个数组中存在什么样的对象。

编译器不会让我这么做的!让我简化我的问题,说我想转换成一个包含字符串的数组。这就是我试过的:

代码语言:javascript
运行
复制
var strings = myObjcObject.getStrings() as [String]

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

‘'String’和'AnyObject‘不一样

我必须同意编译器的意见,因为字符串确实与AnyObject不完全相同。但我不明白为什么这是个问题。如果我想的话,我可以让AnyObject下线,对吗?

我也试过:

代码语言:javascript
运行
复制
var strings = myObjcObject.getStrings() as? [String]

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

'NSArray‘不是'NSMutableArray’的一个子类型

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

EN

回答 7

Stack Overflow用户

回答已采纳

发布于 2014-09-14 20:30:05

您可以通过双下播来完成这个工作,首先是NSArray,然后是[String]

代码语言:javascript
运行
复制
var strings = myObjcObject.getStrings() as NSArray as [String]

在游乐场测试的有:

代码语言:javascript
运行
复制
import Foundation

var objCMutableArray = NSMutableArray(array: ["a", "b", "c"])
var swiftArray = objCMutableArray as NSArray as [String]

更新:

在Swift的后续版本(至少1.2)中,编译器会抱怨as [String]。相反,您应该使用带有条件下行if letas?

代码语言:javascript
运行
复制
import Foundation

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

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

代码语言:javascript
运行
复制
import Foundation

var objCMutableArray = NSMutableArray(array: ["a", "b", "c"])
var swiftArray = objCMutableArray as NSArray as! [String]
票数 137
EN

Stack Overflow用户

发布于 2016-01-21 14:35:07

compactMap是斯威夫特4.1及以上的朋友,也是斯威夫特3.3-3.4的朋友.这意味着你没有任何双重或强制铸造。

代码语言:javascript
运行
复制
let mutableArray = NSMutableArray(array: ["a", "b", "c"])
let swiftArray: [String] = mutableArray.compactMap { $0 as? String }

在Swift、2.03.2和4.0的早期版本中,您将希望为此目的使用flatMap。用法与compactMap相同

代码语言:javascript
运行
复制
let swiftArray: [String] = mutableArray.flatMap { $0 as? String }
票数 37
EN

Stack Overflow用户

发布于 2015-03-13 23:29:42

使用Swift 1.2,以下内容将有效:

代码语言:javascript
运行
复制
let mutableArray = NSMutableArray(array: ["a", "b", "c"])
let swiftArray = NSArray(array: mutableArray) as? [String]
票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25837539

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档