前言

Swift属性分为

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

一、 计算型属性

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

注意

get + set 为计算型属性的原因

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

计算型属性手动实现了get和set方法后会报警告

xcode建议大家直接get方法return返回当前属性,因为他会把当前属性画横线。

  1. 计算属性有set时的get方法
    计算属性有set时的get方法
  2. 计算属性有无set时的get方法
    计算属性有无set时的get方法
  3. 计算属性有set,无get方法时:
    计算属性有set无get方法时
get + set正确使用方法:作为其他属性的外部接口
    // 私有属性,只能在当前类中访问
    private var _squre:Double = 0.0
    // 可以在任何地方调用
    var squre: Double {
        get {
            return _squre
        }
        set {
            if newValue <= 0 {
                print("newValue = (newValue)")
            }else{
                _squre = newValue
            }
        }
    }

--------- 赋值 --------
let swiftRootVC = TestVC()
swiftRootVC.squre = 10
// 报错错误信息为:'_squre' is inaccessible due to 'private' protection level
// swiftRootVC._squre = 10
self.navigationController?.pushViewController(swiftRootVC, animated:true)

--------- 调用 --------
    override func viewDidLoad() {
        super.viewDidLoad()

        print("_squre = (_squre)")
    }

存储型属性

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

willSet

var name: String = "" {
    willSet(newName) {
        print("The name will be changed from (name) to (newName)")
    }
}
// 在上面的示例中,name属性被初始化为空字符串,定义了一个willSet代码块,它会在name属性的值将要被设置打印一条消息。如果您稍后更改name的值,例如:
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 状态
class TestVC {
// 注:class没有继承至ViewController

    init(squre: Double) {
        self.squre = squre
    }
    var squre: Double {
        willSet {
            print("willSet方法被调用")
            print("在willSet中,width = (squre),newValue = (newValue)")
        }
        
        didSet {
            print("didSet方法被调用")
            print("在didSet中,width = (squre),oldValue = (oldValue)")
        }
    }
}

初始化方法生成对象,并不会触发属性的 willSet didSet 方法:

// 初始化方法 没有触发 willSet didSet
 let testSqure = TestVC.init(squre: 99.99)
 // 打印99.99
print("testSqure = (testSqure.squre)")  

注意:

  1. 有willSetdidSet不能写set、get
    有willSetdidSet不能写set、get

参考文献

[1]: Swift5 didSet willSet set get
[2]: Swift 计算属性、存储属性

2023年3月第一次编写
2023年3月28日,第二次编写

原文地址:https://blog.csdn.net/M316625387/article/details/129530131

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任

如若转载,请注明出处:http://www.7code.cn/show_39684.html

如若内容造成侵权/违法违规/事实不符,请联系代码007邮箱suwngjj01@126.com进行投诉反馈,一经查实,立即删除

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注