【发布时间】:2015-05-01 20:22:03
【问题描述】:
错误:
不能为“[NSObject : AnyObject]?”类型的值下标?带着 “字符串”类型的索引
代码:
func getApple(appleId: String) {
var apples = userDefaults.dictionaryForKey("apples_array")
println(apples[appleId])
【问题讨论】:
错误:
不能为“[NSObject : AnyObject]?”类型的值下标?带着 “字符串”类型的索引
代码:
func getApple(appleId: String) {
var apples = userDefaults.dictionaryForKey("apples_array")
println(apples[appleId])
【问题讨论】:
应该是:
var apples = userDefaults.dictionaryForKey("apples_array")
println(apples?[appleId])
这里的问题是[NSObject : AnyObject]? 类型暗示了一个可选类型,这意味着你试图在本质上是一个枚举上调用一个下标。当您尝试这样做时,没有声明下标,因此系统阻塞。
通过添加? 我们说,如果可能的话,解开这个值,然后调用下标。这样,系统推断在类型 [NSObject : AnyObject] 上查找下标声明,一切正常。
您也可以使用! 强制展开,但如果apples 为nil,则会崩溃。另一种可能的写法是:
let apples = userDefaults.dictionaryForKey("apples_array") ?? [:]
println(apples[appleId])
这样,apples 不再是可选的,它总是有下标语法。无需解包。
【讨论】:
我认为使用可选绑定要清楚得多,这样 println 仅在有实际值要打印时才被调用
func getApple(appleId: String) {
if let apples = userDefaults.dictionaryForKey("apples_array") {
println(apples[appleId])
}
}
【讨论】: