[Swift Tips 读书笔记]从 Objective-C 到 Swift(四)

  1. KVO
  1. 局部 scope
  2. 判等
  3. 哈希
  4. 类簇
  5. 调⽤ C 动态库

--

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() //实例化一个被观察对象
      car?.brand = "BMW"
      print("现在时间 \(Date()),品牌(\(String(describing: car?.brand))")
      
      // 添加观察者 self 、观察的路径 brand 、观察项 有了新值 、
      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("现在时间\(Date()),品牌变化: \(String(describing: change[.newKey]))")
        }
      }
    }
    
    //实例化一个Customer
    _ = Customer()
    
    //log 结果
    现在时间 2017-06-08 02:24:19 +0000,品牌(Optional("BMW")
    现在时间2017-06-08 02:24:23 +0000,品牌变化: Optional(BYD)
    
  • 如果我们想要监测一个类的属性,没有用dynamic修饰。实现的话就是建一个子类,将被观察的属性用 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中两个字符串是否相同,使用==判等

OC中==是判断两个对象是否指向同一个内存地址。

swift中==是一个操作符的声明

swift中判断两个引用是否指向同一个内存地址使用===

--

哈希

散列表(Hash table,也叫哈希表),是根据关键码值(Key value)而直接进行访问的数据结构。也就是说,它通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度。这个映射函数叫做散列函数,存放记录的数组叫做散列表 -------- 摘自百度百科

除⾮我们正在开发⼀个哈希散列的数据结构,否则我们不应该直接依赖系统所实现的哈希值来做其他操作。⾸先哈希的定义是单向的,对于相等的对象或值,我们可以期待它们拥有相同的哈希,但是反过来并不⼀定成⽴。其次,某些对象的哈希值有可能随着系统环境或者时间的变化⽽改变。因此你也不应该依赖于哈希值来构建⼀些需要确定对象唯⼀性的功能,在绝⼤部分情况下,你将会得到错误的结果。

--

类簇

类簇(class cluster)是Cocoa框架中广泛使用的设计模式之一。使用一个统一的公共的类来定制单一的接口。好处是避免公开很多的子类造成混乱。比方说NSNumber,可以通过initWithInt initWithFloat initWithBool生成,实际上它们可能是不同的私有子类对象。

类簇在子类种类繁多,行为相对统一的时候对于简化接口很有帮助。

swift中,初始化的时候我们只能得到当前类的实例,并且要完成所有的配置。就是说,对于一个公共类来说,是不可能在初始化方法中返回其子类的信息。类簇的实现相对于OC来说就麻烦些了,一个有效的方式是通过工厂方法实现类簇。

class Car: NSObject {

var desc: String? {
    return "车的调性"
}
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"
  }
}

--

调⽤ C 动态库

OC是C的超集,但是swift中不能直接使用C的库或者代码,最好的方法是通过{product-modulename}-Bridging-Header.h调用OC,从而调用C。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,684评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,143评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,214评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,788评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,796评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,665评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,027评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,679评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 41,346评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,664评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,766评论 1 331
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,412评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,015评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,974评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,203评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,073评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,501评论 2 343

推荐阅读更多精彩内容