我的团队决定新文件应该用 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
,执行正确进入。
为什么我似乎无法进入我的set
方法通过-setValueForKey
?
我已经100%确认了textObject
存在并且是正确的类型。
EDIT:
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 按预期工作。它还可以与可选的
类类型,例如NSNumber?
.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)