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

时间:2015-05-03 23:03:57

标签: swift

   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"] 

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

1 个答案:

答案 0 :(得分:20)

错误是因为您尝试在可选值上使用下标。您正在转换为[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
}

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

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

希望有所帮助。