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 并且您可能需要显式注释每个属性或方法。
我正在尝试将我的代码从 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 并且您可能需要显式注释每个属性或方法。