Пользовательский NSValueTransformer в xcode 6 с быстрым

Кто-нибудь успешно реализовал пользовательский NSValueTransformer в xcode 6 beta с быстрым?

У меня есть следующий быстрый класс:

import Foundation

class myTransformer: NSValueTransformer {

  let amount = 100

  override class func transformedValueClass() -> AnyClass!
  {
    return NSNumber.self
  }

  override func transformedValue(value: AnyObject!) -> AnyObject! {
    return value.integerValue + amount
  }
}

Итак, все, что должен сделать этот трансформатор, заключается в добавлении 100 к заданному значению в gui.

Как вы можете видеть, теперь класс трансформатора появляется в выводе Value Transformer в IB.

enter image description here

Но если я выберу этот трансформатор, приложение сбой:

2014-08-27 20:12:17.686 cdTest[44134:303] 
*** Terminating app due to uncaught exception 'NSInternalInconsistencyException', 
reason: 'Cannot find value transformer with name newTransformer'

Правильно ли зарегистрировать этот трансформатор в AppDelegate с помощью

override class func initialize() {
  let newTransformer = myTransformer()
}

Кто-нибудь знает, как все это должно работать?

добро пожаловать! Мартин

Ответы

Ответ 1

После инициализации newTransformer вы также должны включить строку:

NSValueTransformer.setValueTransformer(newTransformer, forName: "myTransformer")

Затем в вашем построителе интерфейсов вы можете использовать myTransformer вместо newTransformer в раскрывающемся списке Value Transformer.

Ответ 2

Из примечаний к выпуску Xcode:

Если вы установите подкласс Swift для NSValueTransformer в качестве значения привязки трансформатор, XIB или раскадровка будут содержать недопустимую ссылку для класса, и привязка не будет работать должным образом во время выполнения. Вы может либо ввести имя измененного класса в поле Value Transformer или добавить атрибут @objc (...) в подкласс NSValueTransformer, чтобы решите эту проблему. (17495784)

Из руководства Swift:

Чтобы сделать ваш класс Swift доступным и пригодным для использования в Objective-Cсделать его потомком класса Objective-C или пометить его с помощью @objc атрибут. Чтобы указать конкретное имя для класса, который будет использоваться в Objective-C отметьте его @objc (< # name # > ), где < # name # > - это имя что ваш код Objective-C будет использоваться для ссылки на класс Swift. Для более подробную информацию о @objc см. в разделе Совместимость типов Swift.

Решение:

Объявите свой класс как @objc(myTransformer) class myTransformer: NSValueTransformer, а затем вы можете использовать "myTransformer" как имя...