随着 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
// set
object[keyPath: name] = "swift4"
// get
let 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<iOS11.XXX, Swift.String>
另外一件事就是被观察的属性需要用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 实例,需要自己控制这个实例的生命周期。
- 大小: 17.5 KB
- 大小: 22.6 KB
分享到:
相关推荐
KVC 与 KVO 使用姿势和原理解析
自己练习swift时做的KVC和KVO的案例,供初学者使用
已经拥有一年经验的你真的了解KVC,KVO吗?也许不!以前我以为自己都有上架项目,这都是太基础的东西,但今天我重新回头看了以前做的笔记,真的是书读百遍,其义自见。
关于ios学习中的通知和kvc,kvo案例的整理,基础的oc学习
使用KVC对属性赋值 使用KVC对属性取值 KVC对数组取值 KVO是key value observing, 它是一种非常重要的机制,允许监听属性值的变化
KVC、kVO原理详解
但需要注意的是,键值观察(KVO)是建立在键值编码(Key Value Coding,简称KVC)的基础上,也就是说任何你想使用KVO观察的属性必须符合键值编码。 这个demo主要以字符串、数组为例来学习键值编码和键值观察。 ...
iOS中KVC-KVO例子,
相信通过这个工程可以让初学者更好的理解iOS的kvc和kvo模式,如果有需要相关文档的可以留言给我。
这里是我看别人博客写的kvc与kvo,自己写的代码,本来不打算收费,但是找不到免费的按钮在哪,所以就选了最小的资源分数1.
KVC 是基于OCRuntime机制,Runtime机制里面可以通过得到实例变量并且访问其私有的成员变量区;实现keyPath中的访问能力;KVO一种通知发送机制,实现一对多,多对一的映射关系
详细的介绍了KVO与KVC的原理机制,可以有效运用KVO-KVC编程
本文档主要是针对KVC和KVO的使用方法的一些总结,希望对大家有所帮助。
与博客配套的KVC KVO代码,博客地址http://blog.csdn.net/liuyinghui523/article/details/77885198 简单的总结
KVC编程思想:KVC运用了一个isa-swizzling技术。isa-swizzling就是类型混合指针机制。
【Debugging Tips, Searching, Notifications, KVC,KVO】[PDF] [iPhone/iPad/iOS]
KVO_App iOS Objective-C中KVC和KVO的基本实现
代码仅供参考 #import "lgsAppDelegate.h" #import "Student.h" #import "Teacher.h" @implementation lgsAppDelegate - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:...
KVC_KVOTest Demo代码 KVC KVO IOS 观察者 Observe
主要介绍了iOS 中KVC、KVO、NSNotification、delegate 总结及区别的相关资料,需要的朋友可以参考下