如何解决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"
}
}
通常,我认为这可能是一个不好的设计。无需“重新初始化”,而是用结构替换此类,并在需要重置时将其丢弃并替换。通常,创建结构非常便宜。但是,如果您需要这样做,则默认值为可以。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。