动态属性前缀dynamic

有时候我们需要在运行中动态传递一个属性的信息,就比如KVO模式下,我们为了让一个类的属性能够进行消息监听,需要做什么呢?
先来看下面一段代码

class KVODemoClass: NSObject {
    var number = 1
}
class Test: NSObject {
    var kvo: KVODemoClass
    override init() {
        kvo = KVODemoClass()
        super.init()
        kvo.addObserver(self, forKeyPath: "number", options: .New, context: nil)
    }
    
    deinit {
        kvo.removeObserver(self, forKeyPath: "number")
    }
    
    override func observeValueForKeyPath(keyPath: String?, ofObject object: AnyObject?, change: [String : AnyObject]?, context: UnsafeMutablePointer<Void>) {
        if keyPath == "number" {
            print("change")
        }
    }
}

let test = Test()
test.kvo.number = 2

这是一个非常简单的KVO实现代码,但是运行后控制台什么都没打印。说好的打印change呢?
其实回过头来想一想,Swift默认设定属性为静态的,即使继承了NSObject对象,因此如果我们想让一个属性能够得到动态监听,只要把最前面相应的类代码修改为

class KVODemoClass: NSObject {
    dynamic var number = 1
}

于是你会惊喜地发现控制台输出change了,不是么?

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 转至元数据结尾创建: 董潇伟,最新修改于: 十二月 23, 2016 转至元数据起始第一章:isa和Class一....
    40c0490e5268阅读 1,758评论 0 9
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,859评论 18 139
  • 发现 关注 消息 iOS 第三方库、插件、知名博客总结 作者大灰狼的小绵羊哥哥关注 2017.06.26 09:4...
    肇东周阅读 12,198评论 4 61
  • 真觉得自己有时候够笨的,之前一直以为简书只能在电脑版写文章,然后下载了又卸载了。就一直在自己的手机里写文章,都是写...
    陈康慧阅读 315评论 4 10
  • 来,这碗鸡汤,我先干为敬! —1— 按惯例,鸡汤文开头要讲个故事。 我们部门有一个90后妹子,积极主动,很正能量,...
    我是Stefanie阅读 824评论 1 4