我正在学习斯威夫特。
我这些天大部分都在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)用户定义的检查属性 on(NSWindow):[addObserver: forKeyPath:@“theComputeSettings.totalToCalculate”选项:256 context:0x0]被发送到一个不符合KVC标准的对象 “theComputeSettings”属性。
相反,如果我绑定到虚拟属性foo
(因此模型关键路径设置为self.foo
),它可以完美地工作。在这种情况下,我看到我的文本字段显示我的值为12。
有没有办法使用Swift结构并仍然可以使Cocoa绑定工作?我做了相当多的谷歌搜索,但找不到任何东西。
我当然可以通过手动方式完成,并编写一些粘合代码,将我的结构中的值安装到我的窗口视图中,但我更喜欢使用Cocoa绑定。这就是他们的目的。
答案 0 :(得分:12)
你不能将Cocoa绑定与Swift结构一起使用。
Cocoa绑定系统是在Key-Value Observing之上实现的,而Key-Value Observing是通过创建一个子类来拦截发送给被观察对象的set<Property>:
消息来实现的。 Swift结构不能有子类,也不一定使用消息或函数调用来设置struct字段,因此通常无法拦截Swift结构字段的设置。
该消息抱怨缺乏KVC合规性,因为键值编码为消息名称定义了set<Property>:
(和<property>
getter)约定。