Тайфун со свойством контроллера представления

У меня урок:

class InformationTableViewController: UITableViewController {
    private var cos: Int!
}

И я пытаюсь ввести свойство:

public dynamic func informationTableViewController() -> AnyObject {
    return TyphoonDefinition.withClass(InformationTableViewController.self) {
        (definition) in

        definition.injectProperty("cos", with: 3)
    }
}

Когда это простой класс, он работает нормально. Но когда я использую InformationTableViewController в раскадровке (как некоторый класс представления), я получаю сообщение об ошибке:

'Can't inject property 'cos' for object 'Blah.InformationTableViewController: 0x7fca3300afe0'. Setter selector not found. Make sure that property exists and writable'

В чем проблема?


person Community    schedule 05.11.2015    source источник


Ответы (1)


Модификатор закрытого доступа ограничивает использование объекта его собственным определяющим исходным файлом.

Итак, одна проблема заключается в том, что вы пытаетесь установить свою собственность из-за пределов ее частной области. Удалить ключевое слово private из объявления свойства.

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

В Obj-C Typhoon поддерживает внедрение примитивных типов, но пока не в Swift.

Каждый класс, который вы хотите внедрить, должен быть каким-то образом подклассом NSObject (либо путем создания подкласса, либо путем добавления модификатора @objc).

В качестве обходного пути вы можете использовать NSNumber вместо типа Int для своего свойства.

class InformationTableViewController: UITableViewController {
   var cos: NSNumber!
}

Сборка:

public dynamic func informationTableViewController() -> AnyObject {
    return TyphoonDefinition.withClass(InformationTableViewController.self) {
        (definition) in

        definition.injectProperty("cos", with: NSNumber.init(int: 3))
    }
}
person Alexander Tkachenko    schedule 06.11.2015
comment
Cпасибо за объяснение! - person ; 06.11.2015
comment
Можно ли вводить сеты? - person ; 06.11.2015
comment
Да, я дважды проверил его сейчас, и он работает нормально. Set, Array — это тип объекта, такой как NSArray и NSSet. Но, может быть, если вы вводите несколько свойств данных в свой ViewController, лучше обернуть ваши данные в какой-нибудь класс DataModel, который будет содержать ваши свойства данных, такие как Set, может быть, что-то еще? Просто чтобы сделать некоторую ясную абстракцию - person Alexander Tkachenko; 06.11.2015
comment
Посмотрите на этой странице информацию о том, что можно внедрить в версию Swift Typhoon github.com/appsquickly /Typhoon/wiki/Быстрый старт - person Alexander Tkachenko; 06.11.2015
comment
Хорошо, я использую инфраструктуру Realm и пытаюсь внедрить результаты‹SomeType› (где SomeType: Object), и возникает та же проблема. - person ; 06.11.2015
comment
Пожалуйста, посмотрите на мой быстрый пример проекта. Я реализовал внедрение Set, NSNumber, DataModel и 2 способа внедрения протоколов в соответствии с документацией Typhoon и вопросами stackoverflow по этим темам github.com/tkach/Typhoon-Swift-Storyboard-Sample - person Alexander Tkachenko; 06.11.2015
comment
Спасибо:) Надеюсь, это поможет вам - person Alexander Tkachenko; 06.11.2015