使用 Array 而不是 NSArray 时出现错误“对成员下标的模糊引用”

Posted

技术标签:

【中文标题】使用 Array 而不是 NSArray 时出现错误“对成员下标的模糊引用”【英文标题】:Getting error "ambiguous reference to member subscript" when using Array instead of NSArray 【发布时间】:2016-12-06 09:12:50 【问题描述】:

当我尝试访问数组类型值然后出现错误时,我在可能包含数组类型值的字典中收到类似“对成员下标的模糊引用”的错误。 请检查以下代码。

var occupations = [
"Malcolm": "Captain",
"Kaylee": "Mechanic",
"Layme": ["Engineer", "Docter"] 
] as [String : Any]


occupations["Jayne"] = "Public Relations"
var arrOfLayme = occupations["Layme"] as! Array //getting error here, If I use NSArray instead of array all will work as expacted
print(valueOcc[0])

当我使用 NSArray 类型时,此代码运行良好,如下行,我想以纯 swift 方式执行,不想添加 Objective-c。

var arrOfLayme = occupations["Layme"] as! NSArray

【问题讨论】:

【参考方案1】:

试试这个:

var occupations:[String:Any] = [
    "Malcolm": "Captain",
    "Kaylee": "Mechanic",
    "Layme": ["Engineer", "Docter"]
    ]

occupations["Jayne"] = "Public Relations"


var arrOfLayme = occupations["Layme"] as! [String]
print(arrOfLayme)

//More safe
if let arr = occupations["Layme"] as? [String] 
    print(arr)

【讨论】:

【参考方案2】:

Swift 是一种强类型语言,因此,您不能像在 Objective C 中使用NSArray 那样访问通用容器。

您需要明确告诉编译器,您希望从字典中检索到哪种Array

执行以下操作:

import Foundation

// Delcare type next to the variable, not at the end
// Makes the code more readable
var occupations: [String : Any] = [
    "Malcolm": "Captain",
    "Kaylee": "Mechanic",
    "Layme": ["Engineer", "Docter"] 
    ]

occupations["Jayne"] = "Public Relations"

// Safe reading
if let arrOfLayme = occupations["Layme"] as? [String] 
    print(arrOfLayme)


// Force casting option 1
var arrOfLayme = occupations["Layme"] as! Array<String>

// Force casting option 2
var arrOfLayme2 = occupations["Layme"] as! [String] 

【讨论】:

谢谢@dirtydanee

以上是关于使用 Array 而不是 NSArray 时出现错误“对成员下标的模糊引用”的主要内容,如果未能解决你的问题,请参考以下文章

Swift - enumerateObjectsUsingBlock的用法

对 NSArray 进行排序时出现 Ios 错误

Swift中实现Array数组和NSArray数组的相互转换与遍历

iOS入门NSarray

fetchedResultsController fetchedObjects 返回一个 NSCFString 而不是 NSArray

如何将 NSMutableArray 转换为 NSArray?