为什么我不能使用从 Objective-C 对象到 Swift 属性 的 KVC?
Why can I not use KVC from an Objective-C object to a Swift Property?
我的团队决定新文件应该写在 swift 中,我发现在 Objective-C 对象中使用 KVC 来设置 属性 Swift 对象。
我的 Objective-C 设置 属性 像这样:[textObject setValue:0.0 forKey:@"fontSize"]
我的 Swift 对象 (textObject
) 为此 属性.
自定义了 setter/getter
var fontSize: CGFloat? {
get {
return internalTextGraphic?.fontSize
}
set {
internalTextGraphic?.fontSize = newValue
}
}
但是,如果我在 set
中设置断点,它永远不会被命中。
我有 Objective-C 个对象也得到了同样的调用,我只是实现了
-setFontSize
,执行正常进入
为什么我似乎无法通过 -setValueForKey
进入我的 set
方法?
我已 100% 确认 textObject
存在并且类型正确。
编辑:
Martin R 是正确的,我必须将类型设置为非可选类型。这是我的工作代码:
var fontSize: CGFloat {
get {
var retFontSize: CGFloat = 0.0
if let fontSize = internalTextGraphic?.fontSize {
retFontSize = fontSize
}
return retFontSize
}
set {
if let textGraphic = internalTextGraphic {
textGraphic.fontSize = newValue
}
}
}
原因是 Swift 可选结构或枚举(在您的情况下 CGFloat?
)
在 Objective-C 中不可表示(您不会看到 属性
在生成的 "Project-Swift.h"
头文件中)。这变得更加明显
如果您标记 属性
明确使用 @objc
,然后您将收到错误消息
error: property cannot be marked @objc because its type cannot be represented in Objective-C
如果将 属性 类型更改为非可选 CGFloat
然后 KVC 按预期工作。它也可以与一个可选的
class类型,如NSNumber?
.
我的团队决定新文件应该写在 swift 中,我发现在 Objective-C 对象中使用 KVC 来设置 属性 Swift 对象。
我的 Objective-C 设置 属性 像这样:[textObject setValue:0.0 forKey:@"fontSize"]
我的 Swift 对象 (textObject
) 为此 属性.
var fontSize: CGFloat? {
get {
return internalTextGraphic?.fontSize
}
set {
internalTextGraphic?.fontSize = newValue
}
}
但是,如果我在 set
中设置断点,它永远不会被命中。
我有 Objective-C 个对象也得到了同样的调用,我只是实现了
-setFontSize
,执行正常进入
为什么我似乎无法通过 -setValueForKey
进入我的 set
方法?
我已 100% 确认 textObject
存在并且类型正确。
编辑:
Martin R 是正确的,我必须将类型设置为非可选类型。这是我的工作代码:
var fontSize: CGFloat {
get {
var retFontSize: CGFloat = 0.0
if let fontSize = internalTextGraphic?.fontSize {
retFontSize = fontSize
}
return retFontSize
}
set {
if let textGraphic = internalTextGraphic {
textGraphic.fontSize = newValue
}
}
}
原因是 Swift 可选结构或枚举(在您的情况下 CGFloat?
)
在 Objective-C 中不可表示(您不会看到 属性
在生成的 "Project-Swift.h"
头文件中)。这变得更加明显
如果您标记 属性
明确使用 @objc
,然后您将收到错误消息
error: property cannot be marked @objc because its type cannot be represented in Objective-C
如果将 属性 类型更改为非可选 CGFloat
然后 KVC 按预期工作。它也可以与一个可选的
class类型,如NSNumber?
.