【发布时间】:2017-11-09 10:51:46
【问题描述】:
我正在努力使用 Swift 4 中新的强类型 KVO 语法来观察仅通过协议可见的属性:
import Cocoa
@objc protocol Observable: class {
var bar: Int { get }
}
@objc class Foo: NSObject, Observable {
@objc dynamic var bar = 42
}
let implementation = Foo()
let observable: Observable = implementation
let observation = observable.observe(\.bar, options: .new) { _, change in
guard let newValue = change.newValue else { return }
print(newValue)
}
implementation.bar = 50
error: value of type 'Observable' has no member 'observe'
let observation = observable.observe(\.bar, options: .new) { _, change in
显然,Observable 不是NSObject。但是我不能简单地将它转换为NSObject,因为keypath的类型与对象的类型不匹配。
我尝试更明确地说明类型:
let observable: NSObject & Observable = implementation
但是:
error: member 'observe' cannot be used on value of protocol type 'NSObject & Observable'; use a generic constraint instead
let observation = observable.observe(\.bar, options: .new) { _, change in
我试图做的事情是不可能的吗?这似乎是一个常见的用例。使用旧的#keypath 语法很容易完成。你能提供任何替代方案吗?谢谢。
【问题讨论】:
-
您的问题解决了吗?我有同样的:-(
-
我还没解决。
标签: swift4 key-value-observing swift-protocols