【问题标题】:Using - observeValueForKeyPath:ofObject:change:context: in Swift 3在 Swift 3 中使用 -observeValueForKeyPath:ofObject:change:context:
【发布时间】:2016-08-25 04:27:47
【问题描述】:

我正在尝试将 Swift 2.2 项目转换为 Swift 3,但出现以下错误:

Method 'observeValue(forKeyPath:ofObject:change:context:)' with Objective-C selector 'observeValueForKeyPath:ofObject:change:context:' conflicts with method 'observeValue(forKeyPath:of:change:context:)' from superclass 'NSObject' with the same Objective-C selector" for the function call

在我的签名是:

func observeValue(forKeyPath keyPath: String?, ofObject: Any?, change: [String : Any]?, context: UnsafeMutableRawPointer?)."

我已阅读 Swift 3 迁移指南网站上的建议:

“解决方法:在执行可选要求之前添加一个@objc(objectiveC:name:) 属性,其中包含原始Objective-C 选择器。”

但我不清楚这实际上应该如何应用到源文件中,到目前为止我尝试过的任何方法都没有成功。

谁能解释一下如何正确设置?

【问题讨论】:

    标签: ios swift cocoa swift3


    【解决方案1】:

    这就是(最终)在 Xcode 版本 8.0 (8A218a) 中使用 Swift 3.0 对我有用的东西:

    @objc
    override open func observeValue(forKeyPath keyPath: String?, of object: Any?, change: [NSKeyValueChangeKey : Any]?, context: UnsafeMutableRawPointer?) {
    

    【讨论】:

      【解决方案2】:

      只需开始输入 observeValueFor...Xcode 就会建议您使用有效的自动完成功能。选择它,你应该很高兴。

      你的函数应该看起来像这样:

      override func observeValue(forKeyPath keyPath: String?, of object: Any?, change: [NSKeyValueChangeKey : Any]?, context: UnsafeMutableRawPointer?) 
      

      【讨论】:

      • 看起来这个类需要是 NSObject 的子类。尝试在没有子类化 NSObject 的情况下在单例中执行此操作,但不起作用。
      • @SunnyPatel 是的,KVO 仅适用于 NSObject 子类(实际上仅适用于 Objc 运行时托管类)。
      猜你喜欢
      • 1970-01-01
      • 2017-02-05
      • 2017-02-17
      • 2018-07-31
      • 2017-07-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多