这就是我通常使用可用的初始化程序定义模型类型的方法.
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
使用结构更好地工作,因为您可以在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只在必要时才在幕后执行实际复制.Swift管理所有值复制以确保最佳性能,您不应该避免分配以尝试抢占此优化.
Swift编程语言