[Swift Tips 讀書筆記]從 Objective-C 到 Swift(四)

  1. KVO
  1. 局部 scope
  2. 判等
  3. 哈希
  4. 類簇
  5. 調(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 }
  }
}

--

局部 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。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容