swift学习日志—— 属性观察
属性观察 (Property Observers) 是 Swift 中一个很特殊的特性,利用属性观察我们可以在当前类型内监视对于属性的设定,并作出一些响应。Swift 中为我们提供了两个属性观察的方法,它们分别是 使用这两个方法十分简单,我们只要在属性声明的时候添加相应的代码块,就可以对将要设定的值和已经设置的值进行监听了:
class MyClass { let oneYearInSecond:NSTimeInterval = 365 * 24 * 60 * 60 var date:NSDate{ willSet { print("即将将日期从 (date) 设定至 (newValue)") } didSet{ if date.timeIntervalSinceNow > oneYearInSecond{ print("设定时间太晚了") date = NSDate().dateByAddingTimeInterval(oneYearInSecond + 800000) //这里让设置值依然大于oneYearInSecond,不会再次触发属性观察的调用(即不会陷入死循环) } print("已经将日期从 (oldValue) 设定至 (date)") } } init(){ date = NSDate() } } let fo = MyClass() fo.date = fo.date.dateByAddingTimeInterval(60_000_000) Log: 即将将日期从 2015-12-29 06:06:13 +0000 设定至 2017-11-22 16:46:13 +0000 设定时间太晚了 已经将日期从 2015-12-29 06:06:13 +0000 设定至 2017-01-06 12:19:33 +0000 A>初始化方法对属性的设定,以及在 在 Swift 中所声明的属性包括存储属性和计算属性两种。其中存储属性将会在内存中实际分配地址对属性进行存储,而计算属性则不包括背后的存储,只是提供
class A { var name:String = "jack" //存储属性 var age :Int { //计算属性 get{ print("get") return 1 } set{ print("set") } } } class B: A { override var age:Int{ //子类都可以设置属性观测器 willSet{ print("age--willSet") } didSet{ print("age--didSet") } } override var name:String{ //子类都可以设置属性观测器 willSet{ print("name--willSet") } didSet{ print("name--didSet") } } } 调用 name和age的 let b = B() b.age = 0 b.name = "Tom" Log:
get age--willSet set age--didSet
name--willSet name--didSet
class A { var name:String = "jack" //存储属性 var age :Int { //计算属性 get{ print("get") return 1 } set{ print("set") } } } class B: A { override var age:Int{ //子类都可以设置属性观测器 willSet{ print("age--willSet") } // didSet{ // print("age--didSet") // } } override var name:String{ //子类都可以设置属性观测器 willSet{ print("name--willSet") } didSet{ print("name--didSet") } } } let b = B() b.age = 0 b.name = "Tom" Log成这样了:
age--willSet set name--willSet name--didSet (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |