快速正确使用getter和setter

Mik*_*keJ 9 ios swift swift2

有人可以帮助我理解快速使用getter和setter的正确用法.我得到的印象与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
    }
}
Run Code Online (Sandbox Code Playgroud)

Luc*_*tti 20

斯威夫特提供了更结构化的方法getterssetters那么Java.

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

相反(如果您正在使用stored properties)只是声明具有可见性的属性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
    }
}
Run Code Online (Sandbox Code Playgroud)

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

对!在Swift中,您可以使用willSetdidSet观察者来完成此操作.

willSet(NEWVALUE)

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

didSet(属性oldValue)

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

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

如果您不需要仅运行某些代码before或者after已更改属性,则只需省略它们即可.

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
Run Code Online (Sandbox Code Playgroud)