亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定

Swift 4學習之KVC與KVO詳解

標簽:
Android

本文和大家分享的主要是swift4中KVC和KVO相关内容,一起来看看吧,希望对大家学习swift有所帮助。

  随着 keypath 得到增强,KVC 和 KVO 的 API 都有了一些进化。

  struct 也支持 KVC

  一个感人的进步就是 struct 也支持 KVC 了。但是并不是使用原有的 setValue:forKeypath 的api。而是利用了swfit 4增加的一个语法特性:自定义索引可以有参数名。

  直接上代码吧:

  struct ValueType {

  var name:String

  }

  var object = ValueType(name: "zhuo")let name = \ValueType.name

  // setobject[keyPath: name] = "swift4"http:// getlet valueOfName = object[keyPath:name]

  通过索引可以方便的进行KVC。

  KVO

  遗憾的是依然只有 NSObject 才能支持 KVO。

  Swift 4中的一个对此有影响的改变是继承 NSObject 的 swift class 不再默认全部 bridge 到 OC。原因可以参考我的前一篇博客:Swift 4新知:自动清除冗余代码减小包大小 。然而 KVO 又是一个纯 OC 的特性,所以如果是 swift class 需要在声明的时候增加@objcMembers 关键字。否则在运行的时候你会得到一个 error:

  fatal error: Could not extract a String from KeyPath Swift.ReferenceWritableKeyPath

  另外一件事就是被观察的属性 需要用 dynamic 修饰 ,否则也无法观察到。

  一个好消息是不需要在对象被回收时手动 remove observer。但是这也带来了另外一个容易被忽略的事情:观察的闭包没有被强引用,需要我们自己添加引用,否则当前函数离开后这个观察闭包就会被回收了。

  @objcMembers class OCClass: NSObject {

  dynamic var name: String

  init(name: String) {

  self.name = name

  }

  }

  class ViewController: UIViewController {

  var swiftClass: OCClass!

  var ob: NSKeyValueObservation!

  override func viewDidLoad() {

  super.viewDidLoad()

  swiftClass = OCClass(name: "oc")

  ob = swiftClass.observe(\.name) { (ob, changed) in

  let new = ob.name

  print(new)

  }

  swiftClass.name = "swift4"

  }

  }

  KVO 之后返回的是一个 NSKeyValueObservation 实例,需要自己控制这个实例的生命周期

原文链接:http://www.apkbus.com/blog-907513-68303.html

點擊查看更多內容
TA 點贊

若覺得本文不錯,就分享一下吧!

評論

作者其他優質文章

正在加載中
  • 推薦
  • 評論
  • 收藏
  • 共同學習,寫下你的評論
感謝您的支持,我會繼續努力的~
掃碼打賞,你說多少就多少
贊賞金額會直接到老師賬戶
支付方式
打開微信掃一掃,即可進行掃碼打賞哦
今天注冊有機會得

100積分直接送

付費專欄免費學

大額優惠券免費領

立即參與 放棄機會
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號

舉報

0/150
提交
取消