(字符串:AnyObject)没有名为“下标”的成员
Posted
技术标签:
【中文标题】(字符串:AnyObject)没有名为“下标”的成员【英文标题】:(String: AnyObject) does not have a member named 'subscript' 【发布时间】:2015-01-18 19:33:52 【问题描述】:我遇到过类似的问题,但仍然不明白为什么我的代码会抛出错误。
var dict = [String:AnyObject]()
dict["participants"] = ["foo", "bar"]
dict["participants"][0] = "baz"
错误在第 3 行:(String: AnyObject) does not have a member named 'subscript'
我将participants
键设置为一个数组,然后尝试更新它的第一个元素,但没有任何运气。出于示例目的,上面的代码被缩短了,但我使用的是[String:AnyObject]
,因为它不仅仅是存储在字典中的数组。
这可能真的很微不足道,但我对 Swift 还是很陌生。提前感谢您的帮助!
【问题讨论】:
【参考方案1】:错误消息会准确地告诉您问题所在。您的字典值被键入为 AnyObject。我知道你知道这个值是一个字符串数组,但 Swift 不知道;它只知道你告诉它什么,这是一个 AnyObject。但是 AnyObject 不能下标(事实上,你根本不能用它做很多事情)。如果你想使用下标,你需要告诉 Swift 这不是 AnyObject 而是某种数组(这里是字符串数组)。
还有第二个问题,即dict["participants"]
实际上甚至不是 AnyObject - 它是一个包装 AnyObject 的 可选。所以你必须解开它和为了下标它。
还有第三个问题,即您不能在适当的位置更改字典内的数组值。您必须提取该值,对其进行变异,然后替换它。
因此,您的整个代码将如下所示:
var dict = [String:AnyObject]()
dict["participants"] = ["foo", "bar"]
var arr = dict["participants"] as [String] // unwrap the optional and cast
arr[0] = "baz" // now we can subscript!
dict["participants"] = arr // but now we have to write back into the dict
专家补充:如果你想变得非常酷和 Swifty(谁不想呢??),你可以通过使用定义和- 调用匿名函数,像这样:
var dict = [String:AnyObject]()
dict["participants"] = ["foo", "bar"]
dict["participants"] =
var arr = dict["participants"] as [String]
arr[0] = "baz"
return arr
()
【讨论】:
您能解释一下为什么您首先将dict
输入为[String:AnyObject]
吗?我并不是说没有理由这样做,但如果每个值都指向一个 String 数组,那么你不妨提前这么说。否则,您将不得不投射。
是的,对不起,我应该更清楚一点。上面的代码更多地用于示例目的,但并不总是有一个数组。在某些情况下,它将具有其他数据类型。我会更新问题。
@Fenda 完全合理;这事儿常常发生。但是你确实需要投射。我已经更新了我的答案来演示。
@Fenda 我刚刚写了一个 Swift 教程,可能会对你有所帮助:你可以从这里开始,从 Dictionary 部分开始:apeth.com/swiftBook/ch04.html#_dictionary 但是你会想要回到 Array 部分, AnyObject 部分,最终可能还有 Optionals 部分。
另外需要注意的是,Swift 中的数组不一定是对象。例如:var my_map : [String:AnyObject] = [ "foo" : [1, 2, 3, 4] ] repl.swift:1:37: error: '[String : Array<Int>]' is not convertible to '[String : AnyObject]'
。在这种情况下,问题在于 Array以上是关于(字符串:AnyObject)没有名为“下标”的成员的主要内容,如果未能解决你的问题,请参考以下文章
[NSObject:AnyObject]?在 Xcode 6 beta 6 中没有名为“下标”的成员错误
类型'(String,AnyObject)'在swift中没有下标成员