不能下标'[String:String]类型的值?' 索引类型为'String'

hun*_*erp 8 swift

   let orch = NSUserDefaults().dictionaryForKey("orch_array")?[orchId] as? [String:String]
   orch[appleId]
Run Code Online (Sandbox Code Playgroud)

错误就orch[appleId]行了:

不能下标'[String:String]类型的值?' 索引类型为'String'

为什么?

问题2:

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

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

ABa*_*ith 22

该错误是因为您尝试在可选值上使用下标.你正在投射,[String: String]但你正在使用投射算子的条件形式(as?).从文档:

这种形式的运算符将始终返回一个可选值,如果无法进行向下转换,则该值将为nil.这使您可以检查成功的向下转发.

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

1.使用as!,如果你不知道确切的返回类型是[String: String]:

// 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
}
Run Code Online (Sandbox Code Playgroud)

2.使用可选的结合是否orchnil:

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

希望有所帮助.