快速正确使用getter和setter

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了快速正确使用getter和setter相关的知识,希望对你有一定的参考价值。

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

与Java相比,Swift为getterssetters提供了更加结构化的方法。

您可以,但不应该像编写代码中那样编写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
另一答案

如果您指定给self。,您将再次调用此方法。此外,没有像旧的Java bean属性模式那样“获取”。最后,如果您确实需要在设置后使用方法进行属性计算或操作,则可以将它们直接构建到变量定义中。

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

}

以上是关于快速正确使用getter和setter的主要内容,如果未能解决你的问题,请参考以下文章

使用 Symfony 2 CLI 工具,如何为子类生成具有正确类型提示的 getter 和 setter?

龙目岛不生成getter和setter?

Lombok 没有生成 getter 和 setter

使用lombok时@Setter @Getter无效

idea中Lombok的Buider构造器模式,getter/setter正确使用方法

setter与getter访问器属性——数据驱动显示