为什么我不能将Objective-C对象中的KVC用于Swift属性?

A O*_*A O 7 objective-c key-value-coding kvc swift

我的团队已决定新文件应该用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
      }
   }
Run Code Online (Sandbox Code Playgroud)

但是,如果我在其中设置断点set,它永远不会被击中.

我有Objective-C对象也得到同样的调用,我只是实现 -setFontSize,并执行正确.

为什么我似乎无法进入我的set方法-setValueForKey?我有100%确认textObject存在并且是正确的类型.

编辑:
马丁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
         }
      }
   }
Run Code Online (Sandbox Code Playgroud)

Mar*_*n R 8

原因是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?.