繁体   English   中英

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

[英]Cannot subscript a value of type '[NSObject : AnyObject]?' with an index of type 'String'

错误:

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

码:

  func getApple(appleId: String) {
     var apples = userDefaults.dictionaryForKey("apples_array")
     println(apples[appleId])

应该:

var apples = userDefaults.dictionaryForKey("apples_array")
println(apples?[appleId])

这里的问题是类型[NSObject : AnyObject]? 暗示一个可选类型,这意味着你试图调用一个基本上是enum的下标。 当你尝试这样做时,没有声明下标,所以系统会窒息。

通过添加? 我们说,如果可能的话,解包这个值,然后调用下标。 通过这种方式,系统可以查看类型[NSObject : AnyObject]以获取下标声明,一切正常。

你也可以用! 强制解包,但如果apples为零则会崩溃。 另一种可能的方法是:

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])
     }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM