一尘不染

快速正确使用吸气剂和吸气剂

swift

有人可以帮助我迅速了解正确使用吸气剂和吸气剂的方法。我对它的印象与说Java不一样。

这是Swift中用于存储和访问类变量的正确用法吗?

class Person {
    private var name: String

    init(name: String) {
        self.name = name
    }

    func setName(name: String) {
        self.name = name
    }

    func getName() -> String {
        return name
    }
}

阅读 241

收藏
2020-07-07

共1个答案

一尘不染

斯威夫特提供了更结构化的方法来getterssetters比Java。

你可以,但你应该 不会 ,写getter和setter方法就像你在你的代码一样。

相反,(如果您使用stored properties)只需声明可见性为non的属性即可private(例如,internal在我的示例中)。这样,您班级外的呼叫者将可以查看属性并进行更改。

class Person {

    var name: String {
        willSet(newValue) {
            print("\(self.name) is going to be renamed as \(newValue)")
        }
        didSet(oldValue) {
            print("\(oldValue) has been renamed as \(self.name)")
        }
    }

    init(name: String) {
        self.name = name
    }
}

好的,但是在java中,getter和setters确实允许我添加自定义逻辑,以便在更改值之前或之后执行。

对!在Swift中,您可以使用willSetdidSet观察者。

willSet(newValue)

您在此处编写要在属性中写入新值 之前
运行的代码。在这里,您可以访问当前值(也将被覆盖),self.name而通过可以使用新值newValue

didSet(oldValue)

您在此处编写要在属性中写入新值
运行的代码。在中,您可以使用来访问旧值(已被覆盖),oldValue而在中可以使用新值self.name

这两个willSetdidSet是可选的(我 不是 在谈论可选的类型!我的意思是你不会被强迫他们写:)。

如果您不需要只运行某些代码beforeafter属性已更改,只需忽略它们。

let aVerySmartPerson = Person(name: "Walter White")
aVerySmartPerson.name = "Heisenberg"

// > Walter White is going to be renamed as Heisenberg
// > Walter White has been renamed as Heisenberg
2020-07-07