gpt4 book ai didi

ios - 如何在 Swift 2 中从 JSON 正确实例化数据模型

转载 作者:行者123 更新时间:2023-11-28 08:53:42 26 4
gpt4 key购买 nike

我正在寻找一种干净且正确的方法来快速实例化数据模型。

我一直在寻找一段时间,但我还没有找到明确的答案。我找到了很多用于教学目的的简单示例(比如 Apple 自己提出的 here ),但不是真实案例。我的意思是:如何从 API 返回的复杂 JSON 中实例化数据模型,同时优雅地管理可选值和失败初始化?

我对纯粹的 swift 风格很感兴趣,所以请不要回答 obj-c 解决方案或建议库以在 swift 中轻松处理 JSONS,因为这不是我问题的重点。一切都有第三方库(我也使用它们),但我在这里寻找的是深入学习 swift 语法并了解其内部模式。

下面我提出了我目前采用的几种解决方案。对您的建议、论点和解释非常感兴趣。

编辑:我特别关心的一些方面:

1) 鉴于模型的属性可以设置为nil,这是最好的属性声明?作为可选?作为未包装的可选?

2) 哪种分配模式最有效? if let 绑定(bind)还是 guard 绑定(bind)?

3) 如何正确处理作为我的实际模型属性的模型的实例化? (考虑下面片段中的 var myObjects)

对于上面的每个问题,我已经找到了答案,但我对其他观点很感兴趣,因为我认为 Swift 是一种非常丰富和可塑的语言,而 Apple 官方文档有时对最佳实践不够清晰。

//Proposition 2: property as Optionals and use of guard let

struct MyModel {

let a: String?
let b: MyOtherModel? // MyOtherModel is another struct similar to this one
var myObjects = [Object]() // Object is another struct similar to this one

init?(data: AnyObject) {

guard let data = data as? JSON,
let a = json["a"] as? String,
let otherData = json["b"] as AnyObject,
let myObjectsArray = json["objects"] as? [AnyObject] else {
return nil
}
self.a = a
self.b = MyOtherModel(otherData)

for data in myObjectsArray {
if let newObject = Object(data) {
self.myObjects.append(newObject)
}
}
}

}


//Proposition 2: properties as unwrapped Optionals and if let bindings

struct MyModel {

let a: String!
let b: MyOtherModel! // MyOtherModel is another struct similar to this one
var myObjects = [Object]() // Object is another struct similar to this one

init?(data: AnyObject) {

if let data = data as? JSON,
let a = json["a"] as? String,
let otherData = json["b"] as AnyObject,
let myObjectsArray = json["objects"] as? [AnyObject] {

self.a = a
self.b = MyOtherModel(otherData)
for data in myObjectsArray {
if let newObject = Object(data) {
self.myObjects.append(newObject)
}
}
}
else {
return nil
}
}

}

//Proposition 3: properties already initialized, forcing unwrapping of json sub-objects

struct MyModel {

let a = String()
let b = MyOtherModel() // MyOtherModel is another struct similar to this one
var myObjects = [Object]() // Object is another struct similar to this one

init?(data: AnyObject) {

self.a = data["a"]
self.b = MyOtherModel(data["b"]!!)

if let myObjectsArray = data["b"] as [AnyObject] {
for data in myObjectsArray {
if let newObject = Object(data) {
self.myObjects.append(newObject)
}
}
}
if (self.a.isEmpty) {
return nil
}
}
}
}

最佳答案

我认为没有任何“优雅”的方式来处理 JSON。在可读代码方面,我通常采用这种方法,并不是说这是唯一的方法:

型号:

class Category : NSObject {

// Model Objects
var categoryId: NSNumber!
var categoryDesc: String!
var inAppId: String!
var categoryUnlocked: NSNumber!

override init() {
self.categoryId = 0
self.categoryDesc = ""
self.inAppId = ""
self.categoryUnlocked = 0
}

convenience init(categoryDictionary: [String : AnyObject]) {
self.init()

self.categoryId = NSNumber(int: categoryDictionary["CategoryID"]!.intValue)
self.categoryDesc = categoryDictionary["Category_Desc"] as? String ?? ""
self.inAppId = categoryDictionary["InAppID"] as? String ?? ""
self.categoryUnlocked = categoryDictionary["CategoryUnlocked"] as? NSNumber ?? 0
}

}

对于 JSON,我使用 array.map 函数:

var categoryList = [Category]()
if let catArray = data["categories"] as? NSArray {
categoryList = catArray.map({Category(categoryDictionary: $0 as! [String : AnyObject])})
CoreDataService.instance.saveCategories(categoryList)
}

这种方式对于 future 的开发人员来说是整洁和可读的,并且在特定模型中易于管理。

关于ios - 如何在 Swift 2 中从 JSON 正确实例化数据模型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33636219/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com