IOS-SWIFT - Как разрешить предупреждение из Кодекса документации Apple о KVO? Почему автокоррекция Xcode привела к ошибке? - PullRequest
0 голосов
/ 05 сентября 2018

Чтобы узнать КВО, я скопировал код из 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 не используется. После того, как я заменил let observer на _, как это предложено XCode, предупреждение исчезло, но оно выдаст ошибку времени выполнения:

Тема 1: EXC_BAD_ACCESS (код = EXC_I386_GPFLT)

Моя цель - получить ответ на следующие вопросы:

1. Кто-нибудь знает, почему это вызывает ошибку?

2.Как устранить предупреждение?

3.Это пример UPD-DATE для KVO в Swift? Уровень синтаксиса?

1 Ответ

0 голосов
/ 05 сентября 2018

Фрагменты кода в документации Apple приведены только для примера - это не полная реализация.

Предположительно, вы будете делать что-то еще с 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() в консоли отладки.

...