use*_*447 4 initialization swift
我正在尝试实现一些可以使用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
}
}
}
Run Code Online (Sandbox Code Playgroud)
这就是我通常使用可用的初始化程序定义模型类型的方法.
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
}
}
Run Code Online (Sandbox Code Playgroud)
正如您所看到的,我使用Struct而不是Class,至少有两个重要原因:
failable initializers使用结构更好地工作,因为您可以在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
}
}
Run Code Online (Sandbox Code Playgroud)
不!
[...] Swift只在必要时才在幕后执行实际复制.Swift管理所有值复制以确保最佳性能,您不应该避免分配以尝试抢占此优化.
| 归档时间: |
|
| 查看次数: |
604 次 |
| 最近记录: |