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

news/2024/7/20 20:04:50 标签: swift, xcode, ios

前言

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

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

参考文献

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

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


http://www.niftyadmin.cn/n/182899.html

相关文章

在 Flutter 多人视频通话中实现虚拟背景、美颜与空间音效

前言 在之前的「基于声网 Flutter SDK 实现多人视频通话」里&#xff0c;我们通过 Flutter 声网 SDK 完美实现了跨平台和多人视频通话的效果&#xff0c;那么本篇我们将在之前例子的基础上进阶介绍一些常用的特效功能&#xff0c;包括虚拟背景、色彩增强、空间音频、基础变声…

Google代码覆盖率最佳实践

软件质量保障: 所寫即所思&#xff5c;一个阿里质量人对测试的所感所悟。谷歌一直倡导的领域之一是使用代码覆盖率数据评估风险并识别测试中的真空。然而&#xff0c;代码覆盖率的价值一直是个争议的话题。每次聊到代码覆盖率时&#xff0c;似乎都会引发无尽的争论。由于大家固…

R语言中apply系列函数详解

文章目录applylapply, sapply, vapplyrapplytapplymapplyR语言的循环效率并不高&#xff0c;所以并不推荐循环以及循环嵌套。为了实现循环功能的情况下&#xff0c;兼顾效率&#xff0c;R语言提供了apply系列函数&#xff0c;用于对规则的数据进行函数式的迭代处理。 apply a…

【周末闲谈】畅想AR,AR领域迎来新风口

个人主页&#xff1a;【&#x1f60a;个人主页】 系列专栏&#xff1a;【❤️周末闲谈】 周末闲谈 ✨第一周 二进制VS三进制 ✨第二周 文心一言&#xff0c;模仿还是超越&#xff1f; 文章目录周末闲谈前言AR?&#x1f914;&#x1f914;&#x1f914;AR的发展&#x1f463;&…

系统集成路由器OSPF动态、综合路由配置

实验任务&#xff1a;动态路由协议RIP、OSPF协议的内容和特点动态路由RIP、OSPF实验&#xff0c;建立拓扑pc1>>R1>>R2>>R3>>pc2&#xff0c;使pc1与pc2能相互通信&#xff0c;并配置PC端静默接口。熟悉配置vlan间路由技术&#xff1a;多层交换机虚拟接…

OpenAI创始人:GPT-4的研究起源和构建心法

OneFlow编译 翻译&#xff5c;杨婷、贾川、徐佳渝 三十年前&#xff0c;互联网&#xff08;Web 1.0&#xff09;时代开启。人们只能在笨重的电脑上用鼠标点击由HTML编写的网页文本&#xff0c;随后开始支持插入图片&#xff0c;可以上传视频&#xff0c;于是有了网络新闻、搜索…

THUPC2023 初赛(最后的活动-dp概率二分)

[THUPC 2023 初赛] 最后的活动 题目背景 各位亲爱的《La Lumire: Scarlet Intense Flame》玩家&#xff1a; 感谢您一直给予《La Lumire: Scarlet Intense Flame》的支持与厚爱。我们非常遗憾地宣布&#xff0c;《La Lumire: Scarlet Intense Flame》将于 2023 年 3 月 5 日…

【Linux】进程理解与学习Ⅰ-进程概念

环境&#xff1a;centos7.6&#xff0c;腾讯云服务器Linux文章都放在了专栏&#xff1a;【Linux】欢迎支持订阅&#x1f339;相关文章推荐&#xff1a;【Linux】冯.诺依曼体系结构与操作系统进程概念什么是进程&#xff1f;进程是什么&#xff1f;我们打开任务管理器可以看到有…