2

我正在使用 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语法?

4

2 回答 2

2

我想不出比你正在做的更优雅的方式,但另外我所做的是将我的检查移到构造函数中。我为我的实现所做的是每个可以反序列化为数据传输对象的类,我必须为将字典作为参数的构造函数提供一个实现。字典是来自 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)
 }
于 2014-12-17T05:09:49.207 回答
1

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

if let userId = json["user"]["id"].string {
  user = User.create(json["user"])
} else {
  // Do something else, or just ignore it.
}
于 2014-12-17T05:14:35.767 回答