代码之家  ›  专栏  ›  技术社区  ›  Duncan C

如何对Swift结构使用Cocoa绑定

  •  7
  • Duncan C  · 技术社区  · 9 年前

    我在学习斯威夫特。

    这些天我主要在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:@“theComputeSettings.totalToCalculate”选项:256 上下文:0x0]被发送到不符合KVC的对象 “ComputeSettings”属性。

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

    是否有一些方法可以使用Swift结构,并且仍然可以使用Cocoa绑定?我做了大量的谷歌搜索,但一无所获。

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

    1 回复  |  直到 9 年前
        1
  •  12
  •   rob mayoff    8 年前

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

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

    消息抱怨缺乏KVC合规性,因为键值编码定义了 设置<属性>: (和 <property> getter)约定。