(字符串:AnyObject)没有名为' subscript'的成员。

时间:2015-01-18 19:33:53

标签: swift

我遇到了类似的问题,但仍然不明白为什么我的代码会出错。

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 个答案:

答案 0 :(得分:20)

错误消息可以准确地告诉您问题所在。您的字典值键入AnyObject。我知道知道这个值是一个字符串数组,但是Swift不知道这个;它只知道你告诉它的东西,这是一个AnyObject。但AnyObject无法下标(事实上,你根本无法做到这一点)。如果你想使用下标,你需要告诉Swift这不是AnyObject而是某种类型的数组(这里是一个String数组)。

还有第二个问题,即dict["participants"]实际上甚至不是AnyObject - 它是包装AnyObject的 Optional 。所以你必须打开它投射它以便下标它。

然后存在第三个问题,即你不能在字典中改变数组值。您必须提取值,对其进行修改,然后替换它。

因此,您的整个代码将如下所示:

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
}()