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中正确的方法是什么。

解决方法

一种方法是使thing成为隐式解包的可选。这听起来很危险,但实际上只是对几乎所有其他语言(例如Java,Ruby,Python,JS,其中所有对象引用的行为都类似于IUO)所做的回归。

或者,您重复分配。如果值很复杂,则可以像这样提取:

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

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

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

如果您的对象可以“重新初始化”,则默认情况下只需将其初始化为某些基本状态即可。

class Test {
    var thing: String = "" // Add default value
    init() {
        reinit()
    }          

    func reinit() {
        self.thing = "Hello"
    }
}

通常,我认为这可能是一个不好的设计。无需“重新初始化”,而是用结构替换此类,并在需要重置时将其丢弃并替换。通常,创建结构非常便宜。但是,如果您需要这样做,则默认值为可以。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...