为什么我不能使用从 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?.