ToB企服应用市场:ToB评测及商务社交产业平台

标题: 【Swift】01-didSet、willSet、set、get的区别 [打印本页]

作者: 瑞星    时间: 2024-6-15 01:54
标题: 【Swift】01-didSet、willSet、set、get的区别
前言

Swift 的属性分为:

存储型属性就是一般意义上明白的可以进行赋值和取值的变量。
var title = “学科”
计算型属性,字面意思为计算型的属性,这种属性没法存储值
一、 计算型属性

特征:仅有get(readOnly语义)或有get+set的属性是计算型属性,有get+set的属性仅作为其他属性的外部接口
注意

get + set 为计算型属性的缘故原由:

真正赋值的过程是存在于 set 方法中并被底层包装掉的,如果我们手动实现了 set 方法,就无法进行正确赋值:

xcode不建议各人直接在get方法中return返回当前属性,因为他会把当前属性画横线。
get + set 的正确使用方法:作为其他属性的外部接口

  1.     // 私有属性,只能在当前类中访问
  2.     private var _squre:Double = 0.0
  3.     // 可以在任何地方调用
  4.     var squre: Double {
  5.         get {
  6.             return _squre
  7.         }
  8.         set {
  9.             if newValue <= 0 {
  10.                 print("newValue = \(newValue)")
  11.             }else{
  12.                 _squre = newValue
  13.             }
  14.         }
  15.     }
  16. --------- 赋值 --------
  17. let swiftRootVC = TestVC()
  18. swiftRootVC.squre = 10
  19. // 报错,错误信息为:'_squre' is inaccessible due to 'private' protection level
  20. // swiftRootVC._squre = 10
  21. self.navigationController?.pushViewController(swiftRootVC, animated:true)
  22. --------- 调用 --------
  23.     override func viewDidLoad() {
  24.         super.viewDidLoad()
  25.         print("_squre = \(_squre)")
  26.     }
复制代码
存储型属性

注意:初始化方法生成对象,并不会触发属性的 willSet didSet 方法。若想在初始化阶段触发 didSet,可以采用 KVC 的方式给对象初始化。
willSet

  1. var name: String = "" {
  2.     willSet(newName) {
  3.         print("The name will be changed from \(name) to \(newName)")
  4.     }
  5. }
  6. // 在上面的示例中,name属性被初始化为空字符串,定义了一个willSet代码块,它会在name属性的值将要被设置时打印一条消息。如果您稍后更改name的值,例如:
  7. name = "John"
复制代码
那么willSet代码块将自动实行,并打印出消息 “The name will be changed from to John”。
需要注意的是,willSet代码块只会在属性被设置时实行,如果您直接使用其存储来更改属性的值,willSet代码块将不会被实行。此外,willSet代码块中可以使用一个参数newName来访问即将被设置的新值。
didSet

  1. class TestVC {
  2. // 注:class没有继承至ViewController
  3.     init(squre: Double) {
  4.         self.squre = squre
  5.     }
  6.     var squre: Double {
  7.         willSet {
  8.             print("willSet方法被调用")
  9.             print("在willSet中,width = \(squre),newValue = \(newValue)")
  10.         }
  11.         
  12.         didSet {
  13.             print("didSet方法被调用")
  14.             print("在didSet中,width = \(squre),oldValue = \(oldValue)")
  15.         }
  16.     }
  17. }
复制代码
初始化方法生成对象,并不会触发属性的 willSet didSet 方法:
  1. // 初始化方法 没有触发 willSet didSet
  2. let testSqure = TestVC.init(squre: 99.99)
  3. // 打印99.99
  4. print("testSqure = \(testSqure.squre)")  
复制代码
注意:
参考文献

[1]: Swift5 didSet willSet set get
[2]: Swift 计算属性、存储属性
2023年3月第一次编写
2023年3月28日,第二次编写

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。




欢迎光临 ToB企服应用市场:ToB评测及商务社交产业平台 (https://dis.qidao123.com/) Powered by Discuz! X3.4