Элемент «наблюдай» нельзя использовать для значения типа протокола;вместо этого используйте общее ограничение - PullRequest
2 голосов
/ 03 апреля 2019

Я пытаюсь наблюдать свойство (которое объявлено в Objective-C) в Swift.

Протокол Objective-C:

@protocol DemoViewModel <NSObject>
@property (nonatomic, strong) NSString *bla;
@end

Swift наблюдает:

@objc public dynamic var vm: (NSObject & DemoViewModel) {
   didSet {
        vm.observe(#keyPath(DemoViewModel.bla)) { _,_ in
            //do something
        }
    }
}

Интересно, я получаю сообщение об ошибке:
Member ‘observe’ cannot be used on value of protocol type ‘NSObject & DemoViewModel’; use a generic constraint instead

Есть идеи, что происходит?

Спасибо

1 Ответ

0 голосов
/ 05 апреля 2019

В функции observe должно быть что-то особенное, поскольку ко всем функциям и методам можно обращаться по-своему.Вместо этого он просит вас создать что-то вроде этого:

class Foo {
    @objc public dynamic var vm: (NSObject & DemoViewModel)?

    private var observer: NSKeyValueObservation?

    func setVM<T>(_ vm: T) where T: NSObject &: DemoViewModel {
        self.vm = vm
        observer = vm?.observe(\.bla, options: [.old, .new]) { _, _ in
            // do something
        }
    }
}

Когда вы реализуете DemoViewModel, помните, что вам нужно пометить bla как dynamic, иначе наблюдатель не будет вызван.

class Bar: NSObject, DemoViewModel {
    @objc dynamic var bla: String = ""
}
...