`
iaiai
  • 浏览: 2197949 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Swift 4新知:KVC和KVO新姿势

 
阅读更多
随着 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
分享到:
评论

相关推荐

    swift-KVC与KVO使用姿势和原理解析

    Swift中的Key-Value Coding(KVC)和Key-Value Observing(KVO)是两种强大的数据绑定技术,它们允许程序员间接访问对象的属性并监听这些属性的变化。在本文中,我们将深入探讨这两种技术的使用方法、工作原理以及...

    IOS KVC和KVO

    KVC和KVO是Objective-C及Swift中用于对象属性间接访问和观察的重要技术,它们为开发者提供了灵活的数据绑定和动态属性更新机制。在iOS开发中,尤其是在MVVM(Model-View-ViewModel)架构中,这两项技术的应用尤为...

    IOS中KVC和KVO用法demo

    在iOS开发中,Key Value Coding (KVC) 和 Key Value Observing (KVO) 是两种强大的数据处理技术,它们提供了一种间接访问对象属性的方法,以及动态监控属性变化的能力。 KVC,全称Key Value Coding,是Objective-C...

    KVC和KVO实例

    在Swift编程中,KVC(Key-Value Coding)和KVO(Key-Value Observing)是两种...然而,随着Swift语言的发展,如闭包和属性观察器等新特性的引入,KVC和KVO的使用逐渐减少,但在某些特定场景下,它们仍然是十分有用的。

    iOS中KVC-KVO例子

    4. **性能**:虽然KVC和KVO方便,但过度使用可能影响性能,尤其是在大量数据操作时。 在实际开发中,KVC和KVO是强大的工具,但应谨慎使用,确保它们符合你的需求并优化代码的性能。了解这些机制的工作原理以及如何...

    KVC、kVO原理详解

    KVC 和 KVO 是 Objective-C 中两个非常重要的特性,它们为开发者提供了强大的数据访问和观察机制。这两种技术在 Cocoa 和 Cocoa Touch 框架中被广泛使用,使得属性的读取和修改变得更为灵活,同时也简化了对象状态...

    KVC_KVO_Demo

    总之,KVC和KVO是Objective-C中的重要特性,它们提供了一种动态访问和监听对象属性的方式,使得代码更加灵活和可扩展。通过深入理解和实践KVC_KVO_Test项目,初学者能够更好地掌握这些技术,并将其应用于实际的iOS...

    KVO-KVC-demo

    **KVC (Key-Value Coding)** 和 **KVO (Key-Value Observing)** 是Objective-C中的两种重要特性,它们在iOS和Mac OS X开发中被广泛用于对象属性的动态访问和观察。在这个“KVC-KVO-demo”项目中,我们可以深入理解这...

    ios中整理别人的KVC与KVO代码

    在iOS开发中,Key-Value Coding (KVC) 和 Key-Value Observing (KVO) 是两种非常重要的机制,它们都是Objective-C中的特性,用于间接访问对象的属性和监测属性值的变化。这篇文将深入探讨这两种技术,以及如何在实际...

    oc中的通知,kvc,kvo

    - **选项**:KVO提供`NSKeyValueObservingOptionNew`、`NSKeyValueObservingOptionOld`等选项,以便在回调中获取新值和旧值。 - **移除观察**:在不再需要监听时,使用`-[NSObject removeObserver:forKeyPath:]`...

    ios-KVC和KVO学习笔记.zip

    但需要注意的是,键值观察(KVO)是建立在键值编码(Key Value Coding,简称KVC)的基础上,也就是说任何你想使用KVO观察的属性必须符合键值编码。 这个demo主要以字符串、数组为例来学习键值编码和键值观察。 ...

    【Debugging Tips, Searching, Notifications, KVC,KVO】[PDF] [iPhone/iPad/iOS]

    标题指出,文档内容涵盖的是iOS(包括iPhone和iPad)平台上的应用开发中关于调试技巧(Debugging Tips)、搜索功能实现(Searching)、通知系统(Notifications)以及键值编码和观察(Key-...,简称KVC和KVO)的知识点...

    swift-KVC的底层实现

    总的来说,Swift KVC的实现依赖于Swift的反射机制和与Objective-C运行时的交互,而不是像Objective-C那样使用`isa-swizzling`。理解这一机制有助于更好地理解和使用Swift中的KVC,并避免可能出现的问题。在实际开发...

    KVC,KVO机制

    KVC 是基于OCRuntime机制,Runtime机制里面可以通过得到实例变量并且访问其私有的成员变量区;实现keyPath中的访问能力;KVO一种通知发送机制,实现一对多,多对一的映射关系

    swift-用objc库实现KVOKVC

    Swift本身并不直接支持KVO和KVC,但可以通过桥接头文件使用Objective-C的库来实现这些功能。本篇文章将深入探讨如何在Swift中利用objc库来实现KVO和KVC。 首先,理解KVO和KVC的基本概念: 1. KVO(Key-Value ...

    KVC KVO的使用方法

    KVC(Key-Value Coding)和KVO(Key-Value Observing)是Objective-C中用于间接访问对象属性的两种重要技术。它们在iOS和Mac OS X开发中广泛应用于数据绑定和动态属性观察。 KVC是一个非正式的协议,名为...

    ios kvo kvc 编程

    在iOS开发中,键值编码(Key-Value Coding, KVC)和键值观察(Key-Value Observing, KVO)是两个非常重要的概念,它们为Objective-C语言提供了一种灵活的方式来访问和修改对象的属性。通过KVC和KVO,可以简化模型-...

    KVC_KVOTest Demo代码

    4. KVO选项(如`NSKeyValueObservingOptionNew`和`NSKeyValueObservingOptionOld`)的用法,以及如何获取属性变化前后的值。 5. 可能还涉及到错误处理和异常情况,如当尝试访问不存在的键时的处理。 通过分析和学习...

    KVC-KVO原理详解及编程指南

    详细的介绍了KVO与KVC的原理机制,可以有效运用KVO-KVC编程

    MAC下KVO,KVC的小demo

    - **遵循正确的方法命名**:KVO依赖于Objective-C的 runtime,所以被观察的属性需遵循标准的getter和setter命名规则。 - **手动处理属性的移除**:如果对象在释放前没有正确移除观察,可能导致内存泄露或意外的行为...

Global site tag (gtag.js) - Google Analytics