【问题标题】:Cannot convert value of type 'AnyObject?' to expected argument type '[AnyObject]!无法转换类型“AnyObject?”的值到预期的参数类型'[AnyObject]!
【发布时间】:2015-10-28 15:35:34
【问题描述】:

我正在使用 swift lib "Sync" from Hyperoslo 将 JSON 用户转换为 Core Data 对象。

let user = JSON.valueForKey("user")
Sync.changes(user , inEntityNamed: "User", dataStack: DataManager.manager, completion: { (response ) -> Void in
    print("USER \(response)")
})

但是当用我的 JSON 对象设置这个方法的第一个参数时,我有预编译器错误:

无法转换“AnyObject”类型的值?到预期的参数类型 '[AnyObject]!'

如果将我的第一行替换为...

let user = JSON.valueForKey("user") as! [AnyObject] 

...应用程序崩溃并出现此错误:

无法将“__NSCFDictionary”(0x3884d7c8) 类型的值转换为 'NSArray' (0x3884d548)。

如何处理?

已解决感谢@Eric.D的解释

let user = [JSON.valueForKey("user")!]

【问题讨论】:

  • user 是字典而不是数组,所以如果你强制将它转换为它不是的东西,那么它会爆炸。 if let user = JSON.valueForKey("user") as?字典

标签: json swift types casting anyobject


【解决方案1】:

changes() 的第一个参数应该是一个 AnyObject 的隐式展开数组,如下所示:

https://github.com/hyperoslo/Sync#swift

但是您的对象 user 是可选的 AnyObject。

解决方案:安全地解开user,然后将其放入[AnyObject] 数组中,然后再将其用于changes()

【讨论】:

    【解决方案2】:

    首先,user 是一个可选的 AnyObject。你可以永远期望你可以在需要任何非可选的地方使用可选的。通常,您将使用“if let”来检查可选项是否存在。

    但真的,你想在你的数据库中放一个 AnyObject 吗?这是自找麻烦。首先检查它是否具有正确的类型。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-10-28
      • 1970-01-01
      • 2016-07-22
      • 1970-01-01
      • 1970-01-01
      • 2018-03-05
      • 2017-01-06
      • 2016-10-04
      相关资源
      最近更新 更多