Swift3 更新到Swift4后可可绑定(已启用)已断开

Swift3 更新到Swift4后可可绑定(已启用)已断开,swift3,swift4,xcode9,cocoa-bindings,Swift3,Swift4,Xcode9,Cocoa Bindings,我正在尝试将代码从Swift3.3更新到Swift4.1,但遇到KVC错误。 Swift4CoCabinings[4639:2311856][General][addObserver:forKeyPath:@“dbCom.dbFileExists”选项:256上下文:0x0]已发送到与“dbCom”属性不兼容KVC的对象。 我所做的是根据从NSObject继承的singleton类(DBCom.swift)中的属性值禁用菜单项 所以我创建了一个空白项目,一个是Swift3.3,另一个是Swift

我正在尝试将代码从Swift3.3更新到Swift4.1,但遇到KVC错误。
Swift4CoCabinings[4639:2311856][General][addObserver:forKeyPath:@“dbCom.dbFileExists”选项:256上下文:0x0]已发送到与“dbCom”属性不兼容KVC的对象。

我所做的是根据从NSObject继承的singleton类(DBCom.swift)中的属性值禁用菜单项

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

在AppDelegate.swift中,我将单例包括在下面。
让dbCom=dbCom.shared

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

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

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
以及:

从Swift 4开始,您可能需要显式地注释每个属性或方法

@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
        }
    }
}