swift2 快速正确地使用getter和setter

ubby3x7f  于 2022-11-06  发布在  Swift
关注(0)|答案(3)|浏览(192)

有人能帮助我理解swift中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
    }
}
rqqzpn5f

rqqzpn5f1#

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观察器来实现这一点。

将设置(新值)

您可以在这里写入要在属性中写入新值之前执行的程式码。您可以在这里使用self.name存取目前的值(即将被覆写),而新值则可以使用newValue

didSet(旧值)

您可以在这里写入要在属性中写入新值之后执行的程式码。您可以在这里使用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
2skhul33

2skhul332#

如果你赋值给self.,你只需要再次调用这个方法。而且,没有像旧的Java bean属性模式那样的“get”。最后,如果你真的需要在设置后使用方法进行属性计算或操作,它们可以直接构建到变量定义中。

class Person
{
    private var name: String;

    init( name: String )
    {
        self.name = name
    }
}

对于您的简单情况应该足够了,尽管您也可以

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

7gs2gvoe3#

下面是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
        }
    }

}

相关问题