无法使用“String”类型的索引为“[String : AnyObject]”类型的值下标
Posted
技术标签:
【中文标题】无法使用“String”类型的索引为“[String : AnyObject]”类型的值下标【英文标题】:Cannot subscript a value of type '[String : AnyObject]' with an index of type 'String' 【发布时间】:2015-11-16 00:56:42 【问题描述】:我正在尝试从 JSON 内容(在我的 data.swift 文件中)获取一些数据并将其分配给“cmets”。任何人都知道这里出了什么问题以及我该如何解决?似乎是我遇到的语法问题。
我得到的错误:
import UIKit
class CommentsTableViewController: UITableViewController
var story = [String:AnyObject]()
var comments = [String:AnyObject]()
override func viewDidLoad()
super.viewDidLoad()
comments = story["comments"]
tableView.estimatedRowHeight = 140
tableView.rowHeight = UITableViewAutomaticDimension
它不喜欢comments = story["comments"]
部分。
【问题讨论】:
【参考方案1】:您的代码中存在错误,但由于 Swift 编译器错误,您看到的错误消息不正确且具有误导性。实际的错误消息应为:AnyObject is not convertible to [String:AnyObject]
。
self.story["comments"]
返回一个AnyObject
。要将该值分配给self.comments
,您必须首先将AnyObject
类型转换为字典类型[String:AnyObject]
。
例如:
self.comments = self.story["comments"] as! [String:AnyObject]
【讨论】:
谢谢达伦。我这样做了,运行后它崩溃并给了我这条消息:无法将类型“Swift._SwiftDeferredNSArray”(0x10716fff0)的值转换为“NSDictionary”(0x104b46d60)。关于如何进行的提示? 运行时错误意味着story["comments"]
实际上包含一个数组而不是您期望的字典。您可以使用调试器设置断点并检查self.story
的内容,也可以使用NSLog("%@", self.story)
打印内容。或者,您可以将 self.comments
声明为数组而不是字典(并相应地更改类型转换)。【参考方案2】:
根据您自己的声明,story
是[String:AnyObject]
。这意味着story["comments"]
是一个 AnyObject。但是comments
是[String:AnyObject]
,不是 AnyObject。您不能在需要 [String:AnyObject]
的地方分配 AnyObject。
【讨论】:
以上是关于无法使用“String”类型的索引为“[String : AnyObject]”类型的值下标的主要内容,如果未能解决你的问题,请参考以下文章
无法使用“String”类型的索引为“[String : AnyObject]”类型的值下标
无法使用 [NSIndexPath] 类型的索引为 [String] 类型的值下标 - prepareForSegue
尝试修复 Swift 3 错误;无法使用“String”类型的索引为“[[String:AnyObject]]”类型的值下标[关闭]
错误:无法使用“UIImagePickerController.InfoKey”类型的索引为“[String:Any]”类型的值下标 [重复]
Swift - 无法使用“IndexPath”类型的索引为“[Array<String>]”类型的值下标
无法使用索引类型为“(section)”的“[Array<String>]”类型的值下标。类型”(又名“section.Type”)