无法使用“String”类型的索引为“[[String : Any]]”类型的值下标
Posted
技术标签:
【中文标题】无法使用“String”类型的索引为“[[String : Any]]”类型的值下标【英文标题】:Cannot subscript a value of type '[[String : Any]]' with an index of type 'String' 【发布时间】:2018-02-19 14:21:52 【问题描述】:我正在尝试从 json 数组中提取信息,但出现此错误
“不能用 'String' 类型的索引为 '[[String : Any]]' 类型的值下标”
这里
if let rev = place.details?["reviews"] as? [[String:Any]]
if let ver = rev["author_name"] as? String // <- IN THIS LINE I GET THE ERROR
我知道如果我将类型转换为 [String : Any]
而不是 [[String:Any]]
它会起作用,但在这种情况下我必须将它转换为数组数组,否则它不会读取 json,那么如何我解决了这个问题?
【问题讨论】:
【参考方案1】:[[String:Any]]
是一个数组。只能下标Int
索引。
例如,您必须遍历数组:
if let reviews = place.details?["reviews"] as? [[String:Any]]
for review in reviews
if let authorName = review["author_name"] as? String
// do something with authorName
【讨论】:
为什么不在这里使用forEach
循环
@AzmalTech A for
循环对问题的描述性更强。【参考方案2】:
您无法使用String
访问数组中的项目。你必须使用Int
[[String:Any]]
这是一个字典数组。
【讨论】:
【参考方案3】:[[String:Any]]
是一个二维数组。它只能使用 Int 索引进行下标。
最好使用forEach
循环,例如
if let reviews = place.details?["reviews"] as? [[String:Any]]
reviews?.forEach review in
if let authorName = review["author_name"] as? String
// do something with authorName
【讨论】:
【参考方案4】:我认为您在这里混淆了字典和数组。
如果要访问数组中的元素,则必须像这样使用Int
索引
let a = ["test", "some", "more"] // your array
let b = a[0] // print(b) = "test"
如果你想访问字典中的一个元素,你可以通过它的键来访问它,在你的例子中是String
let dict: [String: Any] = ["aKey": "someValue"]
let value = dict["aKey"] // print(value) = "someValue"
在您的情况下,您有一系列字典,每个字典都包含有关评论的信息。如果您想访问您的评论的作者,您必须首先从您的数组中取出评论字典,如下所示:
if let reviews = place.details?["reviews"] as? [[String:Any]],
let review = reviews[0]
// here you can access the author of the review then:
if let author = review["author_name"] as? String
// do something
除了像我的示例那样只访问第一个评论之外,您还可以通过数组循环访问所有评论
【讨论】:
没错,我通常使用一个“安全”下标,它返回一个可选项,而不是在索引超出范围时崩溃。以上是关于无法使用“String”类型的索引为“[[String : Any]]”类型的值下标的主要内容,如果未能解决你的问题,请参考以下文章
无法使用“String”类型的索引为“[String : AnyObject]”类型的值下标
无法使用 [NSIndexPath] 类型的索引为 [String] 类型的值下标 - prepareForSegue
尝试修复 Swift 3 错误;无法使用“String”类型的索引为“[[String:AnyObject]]”类型的值下标[关闭]
错误:无法使用“UIImagePickerController.InfoKey”类型的索引为“[String:Any]”类型的值下标 [重复]
Swift - 无法使用“IndexPath”类型的索引为“[Array<String>]”类型的值下标
无法使用索引类型为“(section)”的“[Array<String>]”类型的值下标。类型”(又名“section.Type”)