如何对Swift结构使用Cocoa绑定



我正在学习Swift。

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

在OSX上,我喜欢使用Cocoa绑定将模型中的值链接到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()
}

然后,我在视图控制器中有一个ComputeSettings类型的实例变量:

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

在我的UI中,我有一个文本字段,用户可以输入要计算的素数的数量。在IB中,我选择字段,选择实用程序区域中的绑定选项卡,然后打开值绑定。我绑定到我的ViewController类。我输入了self.theComputeSettings.totalToCalculate的模型密钥路径。

当我运行我的项目时,它失败了,有一个例外:

无法设置(contentViewController)用户定义的已检查属性上(NSWindow):[addObserver:对于KeyPath:@"ComputeSettings.totalToCalculate"选项:256context:0x0]被发送到不符合KVC的对象"计算机设置"属性。

相反,如果我绑定到伪属性foo(因此模型密钥路径设置为self.foo),它就可以完美地工作。在这种情况下,我看到我的文本字段显示我的值12。

有没有一些方法可以使用Swift结构并仍然让Cocoa绑定工作?我在谷歌上搜索了不少,但什么也找不到。

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

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

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

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

最新更新