2015-03-31 40 views
7

我正在學習Swift。如何使用可可綁定對Swift結構

我大多工作在iOS的這些天,但我目前工作的一個小項目爲OS X

在OSX我喜歡使用Cocoa綁定從我的模型鏈接值的UI元素。它可以節省大量的膠水代碼。

我寫比較斯威夫特到C/Objective-C的性能的程序。我正在使用素數生成器作爲測試項目。

我已創建一個斯威夫特結構ComputeSettings封裝運行在兩個斯威夫特和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的模型關鍵路徑。

當我跑我的項目是失敗的異常:

無法設置(NSWindow)定義檢查屬性 (contentViewController)用戶:[的addObserver: forKeyPath:@ 「theComputeSettings.totalToCalculate」 選項:256 上下文:爲0x0]被髮送到一個對象不是KVC兼容的 「theComputeSettings」屬性。

相反,如果我綁定到虛擬財產foo(所以模型的關鍵路徑設置爲self.foo)它完美的作品。在這種情況下,我看到我的文本字段中顯示我的12

是否有某種方式來使用SWIFT結構,仍然可以得到Cocoa綁定工作的價值?我做了大量的谷歌搜索,但找不到任何東西。

我肯定能做到這一點的手工方式,並寫一堆膠水代碼,從我的結構安裝我的價值觀在我的窗口的觀點,但我寧願使用Cocoa綁定。這就是他們的目的。

回答

9

不能使用Cocoa綁定與斯威夫特結構。

Cocoa綁定系統在鍵值觀察之上實現,並且通過創建子類來實現鍵值觀察,以截取發送到觀察對象的set<Property>:消息。 Swift結構體不能使用子類,也不一定使用消息或函數調用來設置結構體字段,所以通常無法攔截Swift結構體字段的設置。

由於鍵值編碼定義了消息名稱的set<Property>:(和<property> getter)約定,因此該消息會抱怨缺少KVC合規性。

+0

好吧poo。這似乎是一個嚴重的限制。是否有可能在結構和/或結構本身的原始值上實現類別以映射swift didSet方法來調用符合KVO的集合方法?我正在寫500磅。的膠水代碼讀取/顯示值到我的領域。可可綁定是關於OS X開發的更好的事情之一。我真的更願意使用它們,即使這意味着要在前面進行一些繁重的工作。 – 2015-03-31 14:54:23

+0

爲什麼ComputeResults需要一個結構?它實際上是你正在分析的代碼的一部分嗎? – 2015-03-31 16:29:18

+0

它不**具有結構。這似乎是表示數據的最乾淨的方式。我想我會將它更改爲自定義數據對象,因爲對象上的屬性應該符合KVO標準,對吧? – 2015-03-31 17:55:21