迅速正确使用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为getters
和setters
提供了更加结构化的方法,然后是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中,你可以使用willSet
和didSet
观察者来做到这一点。
willSet(NEWVALUE)
在写入新值之前,您在此处编写要运行的代码。 在这里你可以使用self.name
访问当前的值(这个值也被覆盖),而newValue
可以使用新的值。
didSet(属性oldValue)
在此处写入您要在属性中写入新值之后运行的代码。 在这里你可以用oldValue
访问旧值(已被覆盖),而新值在self.name
可用。
willSet
和didSet
都是可选的(我不是在谈论可选types!我的意思是你不会被迫写他们:)。
如果您不需要在属性更改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
如果你分配给自己,你将只是再次调用这个方法。 而且,没有像旧的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 } } }