这些天我主要在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的模型关键路径.
当我运行我的项目时,它失败并出现异常:
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.
相反,如果我绑定到虚拟属性foo(因此模型键路径设置为self.foo)它完美地工作.在这种情况下,我看到我的文本字段显示我的值12.
有没有办法使用Swift结构并仍然可以使Cocoa绑定工作?我做了相当多的谷歌搜索,但找不到任何东西.
我当然可以用手动方式来做,并编写一堆粘合代码来将我的结构中的值安装到我的窗口视图中,但我更喜欢使用Cocoa绑定.这就是他们的目的.