微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Swift类中的初始化器

如何解决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 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?