macos - 如何对 Swift 结构使用 Cocoa 绑定(bind)

标签 macos swift struct cocoa-bindings

我正在学习 Swift。

这些天我主要在 iOS 上工作,但我目前正在为 OS X 开发一个小项目。

在 OSX 上,我喜欢使用 Cocoa 绑定(bind)将值从我的模型链接到 UI 元素。它节省了大量的胶水代码。

我正在编写一个程序,将 Swift 的性能与 C/Objective-C 的性能进行比较。我正在使用素数生成器作为测试项目。

我创建了一个 Swift Struct ComputeSettings,它封装了在 Swift 和 Objective-C 中运行素数生成器的设置(和结果)。该结构如下所示:

struct ComputeResults
{
  var totalCalculated:  Int = 0
  var primesPerSecond:  Int = 0
  var totalTime:        NSTimeInterval = 0
}
struct ComputeSettings
{
  var totalToCalculate: Int = 10000000
  var swiftResults:     ComputeResults = ComputeResults()
  var objCResults:      ComputeResults = ComputeResults()
}

然后我的 View Controller 中有一个 ComputeSettings 类型的实例变量:

class ViewController: NSViewController
{
  var theComputeSettings = ComputeSettings()
  var foo: Int = 12
  //...
}

在我的用户界面中,我有一个文本字段,让用户输入要计算的素数个数。在 IB 中,我选择字段,在实用程序区域中选择绑定(bind)选项卡,然后打开值绑定(bind)。我绑定(bind)到我的 ViewController 类。我输入了 self.theComputeSettings.totalToCalculate 的模型关键路径。

当我运行我的项目时,它因异常而失败:

Failed to set (contentViewController) user defined inspected property on (NSWindow): [ addObserver: forKeyPath:@"theComputeSettings.totalToCalculate" options:256 context:0x0] was sent to an object that is not KVC-compliant for the "theComputeSettings" property.

相反,如果我绑定(bind)到虚拟属性 foo(因此模型键路径设置为 self.foo),它会完美运行。在那种情况下,我看到我的文本字段显示我的值 12。

有没有什么方法既可以使用 Swift 结构又可以让 Cocoa 绑定(bind)正常工作?我进行了大量谷歌搜索,但找不到任何东西。

我当然可以手动完成,并编写一堆粘合代码以将我的值从我的结构安装到我的窗口 View 中,但我更愿意使用 Cocoa 绑定(bind)。这就是他们的目的。

最佳答案

您不能将 Cocoa 绑定(bind)与 Swift 结构一起使用。

Cocoa绑定(bind)系统是在Key-Value Observing之上实现的,Key-Value Observing是通过创建子类拦截set<Property>:实现的。发送给被观察对象的消息。 Swift 结构体不能有子类,也不一定使用消息或函数调用来设置结构体字段,因此通常无法拦截 Swift 结构体字段的设置。

该消息提示缺乏 KVC 合规性,因为键值编码定义了 set<Property>: (和 <property> getter)消息名称约定。

关于macos - 如何对 Swift 结构使用 Cocoa 绑定(bind),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29370659/

相关文章:

c - 返回一个 malloc 指针

macos - 如何获取标准 Mac OS X 图标以在您的应用程序中使用?

macos - 是否可以强制控制 NSWindowController 子类?

macos - OSX 10.9 Mavericks 环境变量 : how to set environment variables

SwiftUI @FetchRequest 对关系的核心数据更改不刷新

c++ - 无法从函数返回结构

objective-c - cocoa/osx - 阻止 NSTextView 扩展超过其框架尺寸

swift - Swift错误: guard body must not fall through

ios - Swift NumberFormat 返回 0.00

c++ - 为什么析构函数在这里被调用两次?