繁体   English   中英

使用属性观察器进行属性封装-Swift

[英]Property encapsulation with property observer - Swift

我正在尝试使用属性观察器进行属性封装。 请参阅下面的示例代码。 如果userName为空,则需要将username设置为Unknown 我正在willSet检查此条件,但是很遗憾,它无法将值设置为self.userName = "Unknown"

如果我对getter-setter进行同样的操作,那么可以通过额外的私有参数来实现。 检查以下代码。

与获取集

private var userName : String
var name : String {
    get {
        return self.userName
    }

    set {
        if newValue.isEmpty {
            self.userName = "Unknown"
        }
    }
}

示例代码-WillSet

class MyClass {
    var userName : String {
        willSet{
            print("Will set called")
            if newValue.isEmpty {
                print("If condi \(newValue) ..")
                self.userName = "Unknown"
            }
        }

        didSet {
            print("Did set called")
        }
    }
    init(name : String) {

        self.userName = name

    }
}


let c = MyClass(name: "Hello")
c.userName = ""
print("var ->", c.userName)

输出:

在此处输入图片说明

问:如何使用willSet实现这种封装? 如果我在某个地方误解了,请纠正我。

谢谢

只需在didSet重置:

class MyClass {
    var userName : String {
        didSet {
            if userName.isEmpty {
                self.userName = "Unknown"
            }
        }
    }

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

但是请记住,不会从init调用属性观察器,因此,如果有人let c = MyClass(name: "") userName仍然是空字符串。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM