SwiftswiftSwift

Swift中willSet和didSet的简述

2020-04-21  本文已影响0人  职业抬棺团队
先了解get/set方法

在Swift中get/set被称之为“计算属性”,它用来间接获取/改变其他属性的值。

如果使用它的计算属性,去处理一些问题,会很简单。


class RectObject : NSObject {
    var width = 100
    var height = 200

    var area:Int? {
        set(temp){
            width = 100
            height = temp / width

        }

        get{
            return width * height
        }

    }
}

如果你用它来存储读取值得话,会非常的难受。

对比OC的set/get代码,写出下面swift的类似set/get方法的例子:

// 使用了外部的一个变量来重写了这个方法
class People : NSObject {
    var _title:String?

    var title:String? {
        set{
            _title = newValue
        }

        get{
            return _title
        }

    }
}

上面这种设置set/get方式有一个痛点,就是需要额外创建一个变量来存储读取,很不方便。
使用didSet就可以很好的去规避这样的问题,并且可以监视变量改变前后的值变化情况。

willSet/didSet方法

举例简单说明,实例代码如下,注意willSet方法里的newValue属性和didSet里面的oldValue属性。

class People : NSObject {
    //普通属性
    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
*/
上一篇下一篇

猜你喜欢

热点阅读