首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >您能“扩展”(即向可编码对象的自动生成构造函数添加额外的初始化逻辑)吗?

您能“扩展”(即向可编码对象的自动生成构造函数添加额外的初始化逻辑)吗?
EN

Stack Overflow用户
提问于 2018-03-16 17:23:56
回答 1查看 508关注 0票数 2

在对象上实现Codable时,编译器可以自动为您生成构造函数。但是,只有当您还没有编写接受解码器的初始化程序时,它才会这样做。

也就是说,我们有一个对象,它具有从解码器设置的大约50个let属性,但我们也有5个基于这些let属性的计算属性。

从技术上讲,如果我们可以在初始化器中计算它们,在解码器设置了另外的50个之后,我们可以简单地将结果存储在它们自己的let vars中,这样就完全不需要计算属性了。

问题是,正如前面提到的,如果您实现了自己的初始化器,编译器就不会自动为您生成一个,所以您不仅需要初始化您的“计算”值,而且还要初始化所有的值。

那么,您是否可以将自己插入到初始化/解码过程中,而不必自己完全重写初始化程序呢?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-03-16 23:18:16

您正在寻找的是类似于委托模式,其中解码器通知其委托,它已经完成解码。遗憾的是,它还没有添加到Swift中。我认为最接近的方法是使用继承,这样Swift就可以为基类中的50 let自动生成解码器,并且可以在子类中初始化计算的属性。例如:

代码语言:javascript
复制
class A: Decodable {
    let firstName: String
    let lastName: String
}

class B: A {
    private var _fullName: String! = nil
    var fullName: String { return _fullName }

    required init(from decoder: Decoder) throws {
        try super.init(from: decoder)
        _fullName = firstName + " " + lastName
    }
}

在A类中定义您的50个属性,并将所有计算属性保留在类B中。

或者根据您的建议,您也可以使用lazy var

代码语言:javascript
复制
struct Model: Decodable {
    let firstName: String
    let lastName: String

    // private(set) so users cannot change value of the
    // pre-computed property
    lazy private(set) var fullName = self.firstName + " " + self.lastName
}

// But you can't use a let here, since calling fullName
// for the first time will mutate the struct
var model = try JSONDecoder().decode(Model.self, from: json)
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49326387

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档