【Swift】01-didSet、willSet、set、get的区别

瑞星  金牌会员 | 2024-6-15 01:54:54 | 显示全部楼层 | 阅读模式
打印 上一主题 下一主题

主题 772|帖子 772|积分 2316

前言

Swift 的属性分为:


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

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


  • 计算型属性自己不占用内存空间,所以不能赋值
  • 计算型属性自己不占用内存空间,所以不可赋值
get + set 为计算型属性的缘故原由:

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

xcode不建议各人直接在get方法中return返回当前属性,因为他会把当前属性画横线。

  • 计算属性有set时的get方法

  • 计算属性有无set时的get方法

  • 计算属性有set,无get方法时:

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


  • willSet是一个属性观察器,用于在属性值将要被设置时实行一段代码。它是一个关键字,用于定义一个代码块,当属性值即将被设置时自动实行。
  • willSet 能获取将要赋给属性的值 newValue
  • 操作的属性是对旧值操作,会被之后的内部 set 覆盖掉
  • 作用:观察
  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


  • didSet是一个属性观测器,答应您观察和响应属性值的变化。它是一个关键字,用于定义每当属性值发生变化时自动实行的代码块.
  • 注意: didSet只有在通过赋值设置属性时才会实行。如果直接使用属性的存储更改属性的值,则不会实行didSet块。
  • didSet 能获取属性之前的旧值 oldValue,新值即为属性
  • 操作属性是对新值进行操作
  • 作用:观察、数据加工
  • 当使用了 didSet 就不能再使用 set 了,因为 didSet 中已经包含了 set 状态
  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)")  
复制代码
注意:

  • 有willSet\didSet不能写set、get

参考文献

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

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

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

正序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

瑞星

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表