无法使用“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”)