(字符串: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(又名 [Int])是一个值类型,而不是一个对象。在您的代码示例中,编译器能够获取您的字符串数组并将其解释为 NSString 的 NSArray,但您的代码通常无法正常工作。

以上是关于(字符串:AnyObject)没有名为“下标”的成员的主要内容,如果未能解决你的问题,请参考以下文章

[NSObject:AnyObject]?在 Xcode 6 beta 6 中没有名为“下标”的成员错误

[任何对象]?没有名为“下标”的成员

任何对象?没有名为“下标”的成员 swift

类型'(String,AnyObject)'在swift中没有下标成员

类型 (string , anyobject) 没有下标成员

swift: 不能用字符串类型的索引下标 [Dictionary<String, AnyObject>] 类型的值