快速正确使用getter和setter

时间:2015-11-30 13:27:02

标签: ios swift swift2

有人可以帮助我理解快速使用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);

3 个答案:

答案 0 :(得分:18)

Swift为getterssetters提供了比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
    }
}

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

右键!在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

答案 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
        }
    }

}