2015-03-31 4 views
7

Я изучаю Swift.Как использовать привязки какао против структур Swift

я в основном работаю в IOS эти дней, но я в настоящее время работаю над небольшим проектом для OS X.

на OSX Мне нравится использовать какао привязки, чтобы связать значения из моей модели к элементам пользовательского интерфейса. Это экономит написание тонн кода клея.

Я пишу программу, которая сравнивает производительность 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: forKeyPath: @ опции "theComputeSettings.totalToCalculate" : 256 context: 0x0] был отправлен объекту, который не соответствует KVC для свойства «theComputeSettings» .

Если, вместо этого, я связываю с фиктивного свойством foo (поэтому путем клавишной модели устанавливаются в self.foo) он прекрасно работает. В этом случае я вижу, что мое текстовое поле отображает мое значение 12.

Есть ли способ использовать структуры Swift и по-прежнему получать привязки Cocoa? Я сделал довольно много googling, но ничего не могу найти.

Я могу сделать это вручную и написать кучу кода клея, чтобы установить мои значения из моей структуры в представления моего окна, но я бы скорее использовал привязки Cocoa. Для этого они нужны.

ответ

9

Вы не можете использовать привязки какао с строками Swift.

Система привязки какао реализована поверх наблюдений за ключевыми значениями, а наблюдение за ключевыми значениями реализовано путем создания подкласса для перехвата сообщений set<Property>:, отправленных наблюдаемому объекту. Структуры Swift не могут иметь подклассы и не обязательно использовать сообщения или вызовы функций для установки структурных полей, поэтому вообще нет способа перехватить настройку поля структуры Swift.

В сообщении сообщается о недостатке соответствия KVC, поскольку кодирование по значению ключа определяет соглашение об именах сообщений set<Property>:<property>).

+0

Well poo. Это кажется серьезным ограничением.Можно ли реализовать категории по примитивным значениям в структурах и/или самих структурах для сопоставления метода swift didSet для вызова метода набора, совместимого с KVO? Я нахожусь в середине письма 500 фунтов. кода клея для чтения/отображения значений в моих полях. Связывание какао - одна из лучших вещей в развитии OS X. Я бы очень сильно использовал их, даже если это означает, что вы делаете тяжелый подъем вперед. –

+0

Почему ComputeResults должна быть структурой? Действительно ли это часть кода, который вы профилируете? –

+0

У него нет **, чтобы быть структурой. Казалось, что самый чистый способ представить данные. Думаю, я поменяю его на пользовательский объект данных, так как свойства на объектах должны быть совместимы с KVO, не так ли? –