Swift:使用可失败初始化器从 JSON 创建模型 Class
Swift: Creating Model Class from JSON with Failable Initializer
我正在尝试实现一些可以用 JSON 数据 [String : AnyObject]
初始化的 类。可失败初始化器似乎非常适合这个用例,但我似乎无法获得正确的语法(不创建难看的代码)。
是否可以这样做?:
class Person {
let firstName: String
let middleName: String?
init?(JSONData data: [String : AnyObject]) {
do {
try {
self.firstName = data["firstName"] as! String
self.middleName = data["middleName"] as? String
}
} catch {
return nil
}
}
}
这就是我通常使用可失败初始化程序定义模型类型的方式。
struct Person {
let firstName: String
let middleName: String?
init?(JSONData data:[String:AnyObject]) {
guard let firstName = data["firstName"] as? String else { return nil }
self.firstName = firstName
self.middleName = data["middleName"] as? String
}
}
为什么是结构体?
如您所见,我使用的是 Struct 而不是 Class,至少有两个主要原因:
failable initializers
使用结构更好,因为您可以 return nil
而无需初始化所有存储的属性
- 它们更快(因为保存在堆栈而不是堆中)
为什么守卫让?
我也更喜欢使用 guard let
构造,因为它清楚地表明,如果未检索到某些强制值,则初始化必须失败。
更多
我的初始化程序版本不需要 middleName
。我决定这样做是因为您将 middleName
定义为可选。但是,如果你想让 middleName
成为强制性的,只需更改 Person
,如下所示
struct Person {
let firstName: String
let middleName: String
init?(JSONData data:[String:AnyObject]) {
guard let
firstName = data["firstName"] as? String,
middleName = data["middleName"] as? String else { return nil }
self.firstName = firstName
self.middleName = middleName
}
}
等等,结构是值类型!我将在每个副本中浪费大量内存 😱
不!
[...] Swift only performs an actual copy behind the scenes when it is
absolutely necessary to do so. Swift manages all value copying to
ensure optimal performance, and you should not avoid assignment to try
to preempt this optimisation.
我正在尝试实现一些可以用 JSON 数据 [String : AnyObject]
初始化的 类。可失败初始化器似乎非常适合这个用例,但我似乎无法获得正确的语法(不创建难看的代码)。
是否可以这样做?:
class Person {
let firstName: String
let middleName: String?
init?(JSONData data: [String : AnyObject]) {
do {
try {
self.firstName = data["firstName"] as! String
self.middleName = data["middleName"] as? String
}
} catch {
return nil
}
}
}
这就是我通常使用可失败初始化程序定义模型类型的方式。
struct Person {
let firstName: String
let middleName: String?
init?(JSONData data:[String:AnyObject]) {
guard let firstName = data["firstName"] as? String else { return nil }
self.firstName = firstName
self.middleName = data["middleName"] as? String
}
}
为什么是结构体?
如您所见,我使用的是 Struct 而不是 Class,至少有两个主要原因:
failable initializers
使用结构更好,因为您可以 returnnil
而无需初始化所有存储的属性- 它们更快(因为保存在堆栈而不是堆中)
为什么守卫让?
我也更喜欢使用 guard let
构造,因为它清楚地表明,如果未检索到某些强制值,则初始化必须失败。
更多
我的初始化程序版本不需要 middleName
。我决定这样做是因为您将 middleName
定义为可选。但是,如果你想让 middleName
成为强制性的,只需更改 Person
,如下所示
struct Person {
let firstName: String
let middleName: String
init?(JSONData data:[String:AnyObject]) {
guard let
firstName = data["firstName"] as? String,
middleName = data["middleName"] as? String else { return nil }
self.firstName = firstName
self.middleName = middleName
}
}
等等,结构是值类型!我将在每个副本中浪费大量内存 😱
不!
[...] Swift only performs an actual copy behind the scenes when it is absolutely necessary to do so. Swift manages all value copying to ensure optimal performance, and you should not avoid assignment to try to preempt this optimisation.