有人可以帮助我理解快速使用getter和setter的正确用法。我得到的印象与Java说的不一样。
这是Swift存储和访问类变量的正确用法吗?
var count = 0;
var tickRange = data[0].data.map((item) => {
count = (count == 3) ? 0 : count+1;
if(count == 1) {
return item.date;
}
})
.filter((d) => d != undefined);
答案 0 :(得分:18)
Swift为getters
和setters
提供了比Java更加结构化的方法。
你可以,但你应该不,像在你的代码中那样编写setter和getter。
相反(如果您使用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
}
}
右键!在Swift中,您可以使用willSet
和didSet
观察者执行此操作。
您在此处写下要在之前运行的代码在属性中写入新值。
在这里,您可以使用self.name
访问当前值(也会被覆盖),而newValue
可以使用新值。
您在此处写下要在中运行的代码在属性中写入新值。
您可以在此处使用oldValue
访问旧值(已被覆盖),而新值可在self.name
中使用。
willSet
和didSet
都是可选的(我不谈论可选类型!我的意思是你没有被迫写它们:)。
如果您不需要仅仅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
答案 1 :(得分:3)
如果您指定给self。,您将再次调用此方法。此外,没有" get"就像旧的Java bean属性模式一样。最后,如果您确实需要在设置后使用方法进行属性计算或操作,则可以将它们直接构建到变量定义中。
class Person
{
private var name: String;
init( name: String )
{
self.name = name
}
}
应该足以满足你的简单情况,尽管你也可以
private var name: String {
didSet {
// updating something after setting
}
};
答案 2 :(得分:1)
这就是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
}
}
}