Swift-屬性觀察著(willSet和didSet)
屬性觀察者,類似于觸發(fā)器.用來監(jiān)視屬性的除了初始化之外的屬性變化,當(dāng)屬性值發(fā)生改變是可以對此作出響應(yīng).有如下特點
1,不僅可以在屬性值改變后觸發(fā)didSet蒸其,也可以在屬性值改變前觸發(fā)willSet腺毫。
2,給屬性添加觀察者必須要聲明清楚屬性類型吓蘑,否則編譯器報錯惕虑。
3,willSet可以帶一個newName的參數(shù)磨镶,沒有的話溃蔫,該參數(shù)默認(rèn)命名為newValue。
4琳猫,didSet可以帶一個oldName的參數(shù)伟叛,表示舊的屬性,不帶的話默認(rèn)命名為oldValue脐嫂。
5统刮,屬性初始化時紊遵,willSet和didSet不會調(diào)用。只有在初始化上下文之外侥蒙,當(dāng)設(shè)置屬性值時才會調(diào)用暗膜。
6,即使是設(shè)置的值和原來值相同鞭衩,willSet和didSet也會被調(diào)用
使用這兩個方法十分簡單,我們只要在屬性聲明的時候添加對應(yīng)的代碼塊,就可以對設(shè)定的值和已經(jīng)設(shè)置的值進(jìn)行監(jiān)聽了:
class MyClass {
var date: NSDate {
willSet {
let d = date
print("即將將日期從 \(d) 設(shè)定至 \(newValue)")
}
didSet {
print("已經(jīng)將日期從 \(oldValue) 設(shè)定至 \(date)")
}
}
init() {
date = NSDate()
}
}
let foo = MyClass()
foo.date = foo.date.dateByAddingTimeInterval(10086)
// 輸出
// 即將將日期從 2014-08-23 12:47:36 +0000 設(shè)定至 2014-08-23 15:35:42 +0000
// 已經(jīng)將日期從 2014-08-23 12:47:36 +0000 設(shè)定至 2014-08-23 15:35:42 +0000
willSet
在項目中我利用willSet來發(fā)送通知
import UIKit
class XNHeadView: UIView {
private var head: UIView?
var tableHeadViewHeight: CGFloat = 0 {
willSet {
NSNotificationCenter.defaultCenter().postNotificationName(HomeTableHeadViewHeightDidChange, object: newValue)
frame = CGRectMake(0, -newValue, ScreenWidth, newValue)
}
}
override init(frame: CGRect) {
super.init(frame: frame)
head = UIView()
head!.frame = CGRectMake(0, 0, ScreenWidth, 200)
head?.backgroundColor = UIColor.redColor()
addSubview(head!)
}
required init?(coder aDecoder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
override func layoutSubviews() {
tableHeadViewHeight = CGRectGetMaxY(head!.frame)
}
}
// ViewController的部分代碼
NSNotificationCenter.defaultCenter().addObserver(self, selector: .homeTableHeadViewHeightDidChange , name: HomeTableHeadViewHeightDidChange, object: nil)
func homeTableHeadViewHeightDidChange(noti: NSNotification) {
collectionView!.contentInset = UIEdgeInsetsMake(noti.object as! CGFloat, 0, 0, 0)
collectionView!.setContentOffset(CGPoint(x: 0, y: -(collectionView!.contentInset.top)), animated: false)
}
效果圖:
紅色視圖跟隨collectionView一起滾動,紅色視圖一般是圖片輪播器
<div align = center>
</div>
示例代碼已經(jīng)上傳到Github
didSet
didSet在這里就不詳細(xì)講解了