在 SwiftyJSON 中处理可选元素的最佳方法是啥?

Posted

技术标签:

【中文标题】在 SwiftyJSON 中处理可选元素的最佳方法是啥?【英文标题】:What is the best way to handle optional element in SwiftyJSON?在 SwiftyJSON 中处理可选元素的最佳方法是什么? 【发布时间】:2014-12-17 04:47:01 【问题描述】:

我正在使用 SwiftyJSON (https://github.com/SwiftyJSON/SwiftyJSON)。假设我有两种格式之一的 JSON 响应:


    "id": 1,
    "foo": "bar"

或者


    "id": 1,
    "foo": "bar",
    "user": "id": 2

我只想在 JSON 中的“用户”元素存在时更新我的​​ Swift 对象的“用户”属性。现在我正在这样做:

let userJson = json["user"]
if userJson.type != .Null && userJson.type != .Unknown 
    user = User.create(userJson)

有没有更好的方法来处理这个问题?比如说,使用 Swift 的 if-let 语法?

【问题讨论】:

【参考方案1】:

我想不出比你正在做的更优雅的方式,但另外我所做的是将我的检查移到构造函数中。我为我的实现所做的是每个可以反序列化为数据传输对象的类,我必须为将字典作为参数的构造函数提供一个实现。字典是来自 API 的 json。我显然在我的代理层中确保它确实可以反序列化,不为空,并且可以表示为字典。

因为我知道 API 调用可能会返回某种错误响应(通常从我的代理层处理)或正是我需要该调用的合同(转换为 DTO)我可以对返回的内容做出一些假设.

在您有可能无法返回的情况下,除非这是一个复杂的项目,否则您可能会在构造函数中进行此类检查,如下所示:

 required init(dict dictionary: NSDictionary)
 
    self.id = dictionary["id"] as Int
    self.foo = dictionary["foo"] as String
    self.user = ( (dictionary["user"] == nil) ? User() : User(dictionary["user"]))
 

所以现在在这里,我说如果它为 nil,则返回一个新的用户对象,但也许你只想保持它为 nil。否则,如果不是,则将“用户字典”(原始 JSON 中的一个子项,在本例中为 "id":2)传递给用户类构造函数,它几乎会做同样的事情,但会水合您的用户对象.

我猜用户类可能是:

 required init(dict dictionary: NSDictionary)
 
    self.id = (dictionary["id"] as Int)
 

【讨论】:

【参考方案2】:

因为 SwiftyJSON 让您可以像使用对象一样使用对象(假设返回用户对象时用户 ID 始终存在),您还可以使用以下检查来简化一些事情:

if let userId = json["user"]["id"].string 
  user = User.create(json["user"])
 else 
  // Do something else, or just ignore it.

【讨论】:

这很好!不过有点hack的感觉:)

以上是关于在 SwiftyJSON 中处理可选元素的最佳方法是啥?的主要内容,如果未能解决你的问题,请参考以下文章

值有时会作为可选字符串返回 SwiftyJSON

条件绑定的初始化程序必须具有可选类型,而不是 '[NSObject: AnyObject]' SwiftyJSON [重复]

在 express api 中处理查询字符串的最佳方法是啥?

在 swift 中使用“默认值”创建非可选 Codable 的最佳方法

处理查询字符串的最佳方法[关闭]

Swift 风格:函数返回您需要的类型的可选类型以便继续,处理此问题的最佳实践是啥?