Swift - 属性观察者(willSet与didSet)

属性观察者,类似于触发器。用来监视属性的除初始化之外的属性值变化,当属性值发生改变时可以对此作出响应。有如下特点:
1,不仅可以在属性值改变后触发didSet,也可以在属性值改变前触发willSet。
2,给属性添加观察者必须要声明清楚属性类型,否则编译器报错。
3,willSet可以带一个newName的参数,没有的话,该参数默认命名为newValue。
4,didSet可以带一个oldName的参数,表示旧的属性,不带的话默认命名为oldValue。
5,属性初始化时,willSet和didSet不会调用。只有在初始化上下文之外,当设置属性值时才会调用。
6,即使是设置的值和原来值相同,willSet和didSet也会被调用

示例如下:


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

class People

{

    //普通属性

    var firstName:String = ""

    var lastName:String  = ""

    var nickName:String  = ""

    

    //计算属性

    var fullName:String

    {

        get

        {

            return nickName + " " + firstName + " " + lastName

        }

    }

    

    //带属性监视器的普通属性

    var age:Int = 0

    {

        //我们需要在age属性变化前做点什么

        willSet

        {

            println("Will set an new value \(newValue) to age")

        }

        //我们需要在age属性发生变化后,更新一下nickName这个属性

        didSet

        {

            println("age filed changed form \(oldValue) to \(age)")

            if age<10

            {

                nickName = "Little"

            }else

            {

                nickName = "Big"

            }

        }

    }

    

    func toString() -> String

    {

        return "Full Name: \(fullName) " + ", Age: \(age) "

    }

    

}

var me = People()

me.firstName = "Zhang"

me.lastName  = "San"

me.age = 20

println(me.toString())

/*程序输出

Will set an new value 20 to age

age filed changed form 0 to 20

Full Name: Big Zhang San , Age: 20

*/

时间: 2024-08-02 05:57:41

Swift - 属性观察者(willSet与didSet)的相关文章

属性观察者willSet与didSet

在Swift中使用willSet和didSet这两个特性来监视属性的除初始化之外的属性值变化. willSet里面是新值,即属性即将要变为的值:didSet里面是旧值,即属性变化之前的值. import Foundation class People : NSObject { //普通属性 var firstName:String = "" var lastName:String = "" var nickName:String = "" //计

Swift中的willSet与didSet

Swift中的willSet与didSet 周银辉 在Swift语言中用了willSet和didSet这两个特性来监视属性的除初始化之外的属性值变化 无需说太多,看看下面的代码你就能很快明白的 import Foundation class People : NSObject { //普通属性 var firstName:String = "" var lastName:String = "" var nickName:String = "" /

Swift属性观察者

为了监听属性的变化,Swift提供了属性观察者,属性观察者能够监听存储属性的变化,即便变化前后的值不同,它们也能监听到,但它们不能延迟存储属性和常量存储属性的变化 Swift中的属性观察者主要有以下两种: 1.willSet:观察者在修改之前调用: 2.didSet:观察者在修改之后调用: 属性观察者的语法如下: 面向对象类型 类型名 { var 存储属性 : 属性数据类型 = 初始值 { willSet(新值){ } didSet(旧值){ } } } 示例 class Employee{ v

存储型变量监视器和属性监视器willset与didset

可以用willset和didset监视器来声明一个存储型变量或属性. var num= 0 { willSet(setter name) { //do something here   } didSet(setter name) { //do something here  } } 当变量或属性的值被改变时,willset和didset监视器提供了一个监视方法(适当的回应). 监视器在变量或属性第一次初始化时不会被运行,只有在值被外部改变时才会被运行. willset监视器只有在变量或属性值被改

Swift - 属性 - 属性监视器(didSet、willSet)

属性监视器 1.属性监视器功能 属性观察器控 制和响应属性的变化, 每次属性被设置值的时候会调用属性观察器,甚至新的值和旧的值相同的时候也不例外. 可以通过重载属性的方法为继承的谁能够(包括存储属性和计算属性)添加属性观察器 注意: 不需要为无法重载的计算属性添加属性观察器, 因为可以通过setter直接监控和响应值的变化 2.属性监视器方法 1. willSet 功能: 在设置新的值之前调用 介绍: illSet 观察器会将新的属性值作为固定参数传入,在willSet的事项代码中可以为这个参数

Object-C---&amp;gt;Swift之(十一)属性观察者

属性观察者机制能让程序在属性被赋值时获得运行代码的机会,用来监视属性的除初始化之外的属性值变化,当属性值发生改变时能够对此作出响应 详细包含两个特殊的回调方法: willSet(newValue):被观察的属性即将被赋值之前自己主动调用方法. didSet(old Value):被观察的属性被赋值完毕之后自己主动调用该方法. 观察的范围 除了延迟存储属性之外的全部存储属性(包含实例存储属性或类型存储属性). 可通过重载方式为继承得到的属性(包含存储属性和计算属性)加入 属性观察者 定义语法格式

属性观察器willSet与didSet

willSet与didSet是swift特有的,就是监听属性值的变化,但有一个小注意点. willSet与didSet调用时机:对象创建后的第一次赋值时开始调用.也就是说,初始化时(包含重载的init或重写的init)不会调用. 1 var name:String?{ 2 willSet{ 3 print("新值:\(newValue):旧值:\(name)") 4 } 5 didSet{ 6 print("旧值:\(oldValue):name = \(name)"

swift语言的学习笔记十一(willSet与didSet)

在Swift语言中用了willSet和didSet这两个特性来监视属性的除初始化之外的属性值变化 无需说太多,看看下面的代码你就能很快明白的 复制代码 import Foundation class People : NSObject { //普通属性 var firstName:String = "" var lastName:String = "" var nickName:String = "" //计算属性 var fullName:St

swift 关键字willSet 和 didSet

// 下面是苹果给出的解释,就是在给属性设置新值的时候,可以在设置前和设置后做一些处理,这两个关键字就好像对该属性变化的监控 If you don’t need to compute the property but still need to provide code that is run before and after setting a new value, use willSet and didSet. For example, the class below ensures tha