【问题标题】:Cannot subscript a value of type '[NSObject : AnyObject]?' with an index of type 'String'无法下标“[NSObject : AnyObject]?”类型的值具有“字符串”类型的索引
【发布时间】:2015-05-01 20:22:03
【问题描述】:

错误:

不能为“[NSObject : AnyObject]?”类型的值下标?带着 “字符串”类型的索引

代码:

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

【问题讨论】:

    标签: ios iphone xcode swift


    【解决方案1】:

    应该是:

    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 不再是可选的,它总是有下标语法。无需解包。

    【讨论】:

    • 好吧,我有这个问题,但我的字典不是可选的...不能用“String”类型的索引为“[String : AnyObject]”类型的值下标
    • @SwiftMatt 我不确定,但这可能会改变 Swift 2.x 的游戏规则。解决方法还是一样。
    【解决方案2】:

    我认为使用可选绑定要清楚得多,这样 println 仅在有实际值要打印时才被调用

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-10-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多