【问题标题】:Cannot subscript a value of type '[String : String]?' with an index of type 'String'不能为“[String : String]?”类型的值下标?具有“字符串”类型的索引
【发布时间】:2015-05-03 23:03:56
【问题描述】:
   let orch = NSUserDefaults().dictionaryForKey("orch_array")?[orchId] as? [String:String]
   orch[appleId]

orch[appleId] 行中的错误:

不能为“[String : String]?”类型的值下标?有索引 '字符串'类型的

为什么?

问题 #2:

   let orch = NSUserDefaults().dictionaryForKey("orch_array")?[orchId] as! [String:[String:String]]
   orch[appleId] = ["type":"fuji"] 

错误:“无法分配此表达式的结果”

【问题讨论】:

标签: swift


【解决方案1】:

错误是因为您尝试在可选值上使用下标。您正在转换为 [String: String],但您使用的是转换运算符 (as?) 的条件形式。来自文档:

这种形式的操作符总是会返回一个可选值,如果向下转型是不可能的,那么这个值就是 nil。这使您能够检查是否成功向下转换。

因此orch 的类型为[String: String]?。要解决这个问题,您需要:

1.如果您确定返回的类型是[String: String],请使用as!

// You should check to see if a value exists for `orch_array` first.
if let dict: AnyObject = NSUserDefaults().dictionaryForKey("orch_array")?[orchId] {
    // Then force downcast.
    let orch = dict as! [String: String]
    orch[appleId] // No error
}

2.使用可选绑定检查orch是否为nil

if let orch = NSUserDefaults().dictionaryForKey("orch_array")?[orchId] as? [String: String] {
    orch[appleId] // No error
}

希望对您有所帮助。

【讨论】:

  • @abakersmith 谢谢,现在,如果我变得稍微复杂一点,为什么我不能 [orchId] as! [String: [String:String] 然后它不会让我 orch["id"] = ["type":"fuji"]
  • 您可以将其发布为对您问题的编辑吗?如果没有正确的格式,这有点难以理解。
  • 该错误是因为您已将orch 声明为常量(使用let)。如果您改用var,您将能够编辑其内容。
  • 第一种方法有什么好处吗?似乎第二种方式做的完全一样,只是更短更安全。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-04-06
  • 2017-03-30
  • 1970-01-01
相关资源
最近更新 更多