迅速正确使用getters和setter

有人可以帮助我迅速理解getter和setter的正确使用。 我得到的印象与Java不一样。

这是在Swift中存储和访问类variables的正确用法吗?

class Person { private var name: String init(name: String) { self.name = name } func setName(name: String) { self.name = name } func getName() -> String { return name } } 

Swift为getterssetters提供了更加结构化的方法,然后是Java。

你可以,但是你不应该像你在代码中那样写setter和getter。

相反(如果你正在使用stored properties )只声明属性的可见性非private (例如在我的例子中的internal )。 通过这种方式,您class上以外的呼叫者将能够看到该房产并进行更改。

 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都是可选的(我不是在谈论可选types!我的意思是你不会被迫写他们:)。

如果您不需要在属性更改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 

如果你分配给自己,你将只是再次调用这个方法。 而且,没有像旧的Java bean属性模式那样的“get”。 最后,如果实际上需要使用方法进行属性计算或设置后的操作,则可以将它们直接构build到variables定义中。

 class Person { private var name: String; init( name: String ) { self.name = name } } 

应该足够你的简单情况,虽然你也可以

 private var name: String { didSet { // updating something after setting } }; 

这就是setter和getter在Java中的工作方式:

 class Person { private var _name private var _age // .... other properties var name: String { get { return _name } set { _name = newValue } } var age: String { get { return _age } set { _age = newValue } } }