Cocoa 更新到 Swift4 后绑定(启用)中断

Cocoa Binding (Enabled) broken after updating to Swift4

我正在尝试将我的代码从 Swift3.3 更新到 Swift4.1,但遇到 KVC 错误。
Swift4CocoaBindings[4639:2311856] [General] [<Swift4CocoaBindings.AppDelegate 0x604000000270> addObserver:<NSKeyValueObservance 0x60c000045e50> forKeyPath:@"dbCom.dbFileExists" options:256 context:0x0] was sent to an object that is not KVC-compliant for the "dbCom" property.

我正在做的是根据继承自 NSObject 的单例 class (DBCom.swift) 中的属性值禁用菜单项。

所以我创建了一个空白项目,一个使用 Swift3.3,另一个使用 Swift4.1,两者都具有相同的 DBCom.swift,看看这个问题是否重现。并发现它被转载了。

在AppDelegate.swift中,我将单例包含如下。
let dbCom = DBCom.shared

然后,
菜单项的绑定在 InterfaceBuilder 中使用 self.dbCom.dbFileExists 启用。 这是在 Swift3.3 上工作的,但是一旦切换到 Swift4.1,应用程序在启动时出现错误。

dbFileExists 在DBCom.swift 中的实现如下。只是检查文件是否存在。

var dbFileExists: Bool {
    get {
        if let dbfp = dbFullPath {
            if FileManager.default.fileExists(atPath: dbfp.path) {
                return true
            } else {
                return false
            }
        } else {
            return false
        }
    }
}

如果有人能提出解决这个问题的方法,我们将不胜感激。

此致,

Cocoa绑定取决于Objective-C的动态特征,如KVC/KVO.

因此,Cocoa 绑定参考中包含的所有属性都需要 Objective-C 兼容。

尝试明确添加 @obc

@objc let dbCom = DBCom.shared

和:

@objc dynamic var dbFileExists: Bool {
    get {
        if let dbfp = dbFullPath {
            if FileManager.default.fileExists(atPath: dbfp.path) {
                return true
            } else {
                return false
            }
        } else {
            return false
        }
    }
}

从 Swift 4 开始,automatic annotation of @objc happens in very limited conditions 并且您可能需要显式注释每个属性或方法。