IOS-SWIFT-如何解决Apple文档代码中有关KVO的警告?为什么Xcode自动校正引入了错误?

问题描述 投票:0回答:1

为了学习KVO,我复制了https://developer.apple.com/documentation/swift/cocoa_design_patterns/using_key_value_observing_in_swift的代码。它如下

 class MyObjectToObserve: NSObject {
        @objc dynamic var myDate = NSDate(timeIntervalSince1970: 0) // 1970
        func updateDate() {
            myDate = myDate.addingTimeInterval(Double(2 << 30)) // Adds about 68 years.
        }
    }

    class MyObserver: NSObject {
        @objc var objectToObserve: MyObjectToObserve
        var observation: NSKeyValueObservation?

        init(object: MyObjectToObserve) {
            objectToObserve = object
            super.init()

            observation = observe(
                \.objectToObserve.myDate,
                options: [.old, .new]
            ) { object, change in
                print("myDate changed from: \(change.oldValue!), updated to: \(change.newValue!)")
            }
        }
    }

    let observed = MyObjectToObserve()
    let observer = MyObserver(object: observed)

    observed.updateDate()

由于未使用observer,因此第二行到最后一行将引发警告。按照Xcode的建议将let observer替换为_之后,警告消失但会产生运行时错误:

线程1:EXC_BAD_ACCESS(代码= EXC_I386_GPFLT)

我的目标是回答以下问题:

1.有人知道它为什么会导致错误吗?

2.如何解决警告?

3.这个例子是关于Swift中KVO的最新版本吗?语法级别?

ios swift xcode key-value-observing
1个回答
1
投票

苹果文档中的代码片段仅作为示例 - 这不是一个完整的实现。

据推测,您将使用observer做其他事情,此时您将不再获得“未使用”警告。

样本用法(仅用于演示,不被视为生产代码):

class ExampleViewController: UIViewController {

    var observed: MyObjectToObserve!
    var observer: MyObserver!

    override func viewDidLoad() {
        super.viewDidLoad()

        observed = MyObjectToObserve()
        observer = MyObserver(object: observed)

    }

    @IBAction func didTap(_ sender: Any) {
        observed.updateDate()
    }

}

创建一个新的视图控制器;把它的类设置为ExampleViewController;添加一个按钮并将其连接到@IBAction func didTap

运行应用程序..每次点击按钮,您都会在调试控制台中看到print()输出。

© www.soinside.com 2019 - 2024. All rights reserved.