- KVO
- 局部 scope
- 判等
- 哈希
- 類簇
- 調(diào)? C 動(dòng)態(tài)庫
--
KVO
-
Swift中KVO使用條件 :NSObject 子類、
dynamic修飾要觀察的屬性//要觀察的類 Car class Car: NSObject { //繼承自 NSObject dynamic var brand : String? // dynamic 修飾 brand } //觀察者類 Customer class Customer: NSObject { var car : Car? var myContext = 0 override init() { super.init() car = Car() //實(shí)例化一個(gè)被觀察對象 car?.brand = "BMW" print("現(xiàn)在時(shí)間 \(Date()),品牌(\(String(describing: car?.brand))") // 添加觀察者 self 、觀察的路徑 brand 、觀察項(xiàng) 有了新值 、 car?.addObserver(self, forKeyPath: "brand", options: NSKeyValueObservingOptions.new, context: &myContext) // 4 秒后給brand賦新值 DispatchQueue.main.asyncAfter(deadline: DispatchTime.now() + 4) { self.car?.brand = "BYD" } } override func observeValue(forKeyPath keyPath: String?, of object: Any?, change: [NSKeyValueChangeKey : Any]?, context: UnsafeMutableRawPointer?) { if let change = change ,context == &myContext { print("現(xiàn)在時(shí)間\(Date()),品牌變化: \(String(describing: change[.newKey]))") } } } //實(shí)例化一個(gè)Customer _ = Customer() //log 結(jié)果 現(xiàn)在時(shí)間 2017-06-08 02:24:19 +0000,品牌(Optional("BMW") 現(xiàn)在時(shí)間2017-06-08 02:24:23 +0000,品牌變化: Optional(BYD) 如果我們想要監(jiān)測一個(gè)類的屬性,沒有用
dynamic修飾。實(shí)現(xiàn)的話就是建一個(gè)子類,將被觀察的屬性用dynamic重寫。
class CarFather: NSObject {
var brand : String?
}
class Car: CarFather {
dynamic override var brand: String? {
get { return super.brand }
set { super.brand = newValue }
}
}
- 對于非NSObject的類 ,參考 Observable-Swift
--
局部 scope
do {
//局部代碼塊
}
//局部代碼塊
self.titleLabel = { () -> UILabel in
let label = UILabel.init(frame: CGRect.init(x: 100, y: 100, width: 80, height: 80))
label.text = "哈哈哈哈"
self.view.addSubview(label)
return label
}()
--
判等
swift中兩個(gè)字符串是否相同,使用==判等
OC中==是判斷兩個(gè)對象是否指向同一個(gè)內(nèi)存地址。
swift中==是一個(gè)操作符的聲明
swift中判斷兩個(gè)引用是否指向同一個(gè)內(nèi)存地址使用===
--
哈希
散列表(Hash table,也叫哈希表),是根據(jù)關(guān)鍵碼值(Key value)而直接進(jìn)行訪問的數(shù)據(jù)結(jié)構(gòu)。也就是說,它通過把關(guān)鍵碼值映射到表中一個(gè)位置來訪問記錄,以加快查找的速度。這個(gè)映射函數(shù)叫做散列函數(shù),存放記錄的數(shù)組叫做散列表 -------- 摘自百度百科
除?我們正在開發(fā)?個(gè)哈希散列的數(shù)據(jù)結(jié)構(gòu),否則我們不應(yīng)該直接依賴系統(tǒng)所實(shí)現(xiàn)的哈希值來做其他操作。?先哈希的定義是單向的,對于相等的對象或值,我們可以期待它們擁有相同的哈希,但是反過來并不?定成?。其次,某些對象的哈希值有可能隨著系統(tǒng)環(huán)境或者時(shí)間的變化?改變。因此你也不應(yīng)該依賴于哈希值來構(gòu)建?些需要確定對象唯?性的功能,在絕?部分情況下,你將會(huì)得到錯(cuò)誤的結(jié)果。
--
類簇
類簇(class cluster)是Cocoa框架中廣泛使用的設(shè)計(jì)模式之一。使用一個(gè)統(tǒng)一的公共的類來定制單一的接口。好處是避免公開很多的子類造成混亂。比方說NSNumber,可以通過initWithInt initWithFloat initWithBool生成,實(shí)際上它們可能是不同的私有子類對象。
類簇在子類種類繁多,行為相對統(tǒng)一的時(shí)候?qū)τ诤喕涌诤苡袔椭?/p>
swift中,初始化的時(shí)候我們只能得到當(dāng)前類的實(shí)例,并且要完成所有的配置。就是說,對于一個(gè)公共類來說,是不可能在初始化方法中返回其子類的信息。類簇的實(shí)現(xiàn)相對于OC來說就麻煩些了,一個(gè)有效的方式是通過工廠方法實(shí)現(xiàn)類簇。
class Car: NSObject {
var desc: String? {
return "車的調(diào)性"
}
class func descCar(brand: String!) -> Car? {
var car: Car?
switch brand {
case "BMW":
car = BMW()
case "BYD":
car = BYD()
default:
car = Car()
}
return car
}
}
class BYD: Car {
override var desc: String? {
return "Cheap"
}
}
class BMW: Car {
override var desc: String? {
return "Sport"
}
}
--
調(diào)? C 動(dòng)態(tài)庫
OC是C的超集,但是swift中不能直接使用C的庫或者代碼,最好的方法是通過{product-modulename}-Bridging-Header.h調(diào)用OC,從而調(diào)用C。