在 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 中处理可选元素的最佳方法是啥?的主要内容,如果未能解决你的问题,请参考以下文章
条件绑定的初始化程序必须具有可选类型,而不是 '[NSObject: AnyObject]' SwiftyJSON [重复]
在 express api 中处理查询字符串的最佳方法是啥?