首页 > 解决方案 > Swift 类中的初始化程序

问题描述

我是从其他语言来到 Swift 的。我有时会在定义一个类时使用一种模式,在该类中,初始化程序调用另一个函数,该函数稍后会被调用以重新初始化。

class Test {
    var thing: String
    init() {
        reinit()    //  'self' used in method call 'load' before all stored properties are initialized
    }               //  Return from initializer without initializing all stored properties
    func renit() {
        self.thing = "Hello"
    }
}

在这种情况下,它不起作用。我真的不想写两次初始化代码,而且我不能使用test.init(),显然是要重新初始化。

这样做的正确方法是什么?

更新

一些评论表明这是一个糟糕的设计,而且很可能是这样。当然,在现实中,应用程序不会那么简单。

关键是我可以用其他语言这样做,所以我想知道 Swift 中的正确方法是什么。

标签: swiftclassconstructorinitializer

解决方案


一种方法是制作thing成隐式展开的可选项。这听起来很危险,但实际上它只是回归到几乎所有其他语言所做的事情(例如,Java、Ruby、Python、JS,所有对象引用的行为都像 IUO)。

或者,您复制分配。如果值很复杂,您可以提取,如下所示:

class Test {
    var thing: String
    init() {
        self.thing = generateThing()
    }

    func renit() {
        self.thing = generateThing()
    }

    func generateThing() -> String { "Hello" }
}

推荐阅读