Тайфун вводит свойство

У меня проблемы с вводом свойства BOOL.

Я пробовал следующее:

- (id)emotionControllerWithItem:(MDDiaryItem *)item firstController:(BOOL)isFirst
{
    return [TyphoonDefinition withClass:[MDEmotionViewController class]
                          configuration: ^(TyphoonDefinition *definition) {
                [definition useInitializer:@selector(initWithAnalytics:) parameters: ^(TyphoonMethod *initializer) {
                    [initializer injectParameterWith:[_services analytics]];
                }];
                [definition injectProperty:@selector(setItem:) with:item];
                [definition injectProperty:@selector(setFirstController:) with:[NSNumber numberWithBool:isFirst]];
            }];
}

Но он падает во время выполнения с EXC_BAD_ACCESS. На самом деле это не свойство BOOL, а свойства внедрения со значениями. Похоже, мое предположение об использовании Typhoon неверно.


person Eugen Martynov    schedule 03.07.2014    source источник
comment
Что вы имеете ввиду под не работает? Не компилируется? Ошибка выполнения? Неожиданное поведение?   -  person JeremyP    schedule 03.07.2014
comment
NB: см. ответ от @Aleksey и обратите внимание, что с Typhoon 2.1.2 (только что запущенным) он обнаружит, определили ли вы примитивные аргументы времени выполнения, потерпите неудачу раньше и предложите решение. .   -  person Jasper Blues    schedule 03.07.2014


Ответы (2)


Аргументы времени выполнения всегда должны быть объектом, а не примитивным типом!

Правильная сборка здесь:

- (id)emotionControllerWithItem:(MDDiaryItem *)item firstController:(NSNumber *)isFirst
{
    return [TyphoonDefinition withClass:[MDEmotionViewController class]
                          configuration: ^(TyphoonDefinition *definition) {
                [definition useInitializer:@selector(initWithAnalytics:) parameters: ^(TyphoonMethod *initializer) {
                    [initializer injectParameterWith:[_services analytics]];
                }];
                [definition injectProperty:@selector(setItem:) with:item];
                [definition injectProperty:@selector(setFirstController:) with:isFirst];
            }];
}

где свойство firstController может иметь BOOL, но при вызове интерфейса сборки вы должны использовать оболочку NSNumber:

[assembly emotionControllerWithItem:item firstController:@YES];
person Aleksey    schedule 03.07.2014
comment
Алексей, это ограничение на Тайфун или обьектив-с? Я не понимаю, откуда ошибка - person Eugen Martynov; 03.07.2014
comment
Это ограничение Тайфуна. Typhoon требуется передать все значения для внедрения в виде объектов. Теперь мы добавили проверку типа аргумента и вызываем исключение при использовании примитивного аргумента во время выполнения. - person Aleksey; 03.07.2014
comment
Также обратите внимание, что Typhoon, как и KVC, разворачивает значения в примитив, если назначение имеет тип примитива. (поддерживаются все примитивные значения, см. github.com/typhoon-framework/Typhoon/issues/ 201) - person Aleksey; 03.07.2014
comment
Спасибо за разъяснение - person Eugen Martynov; 04.07.2014

Как правило, вы можете вводить следующим образом:

[definition injectProperty:@selector(isFirst) with:[NSNumber numberWithBool:YES]];

Но наверное лучше:

[definition injectProperty:@selector(isFirst) with:@(YES)];

Однако аргументы времени выполнения имеют следующие ограничения:

  • Вы не можете вызывать какие-либо методы для аргумента времени выполнения.
  • Аргументы времени выполнения не могут быть примитивами.

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

Ответ @Aleksey показывает обходной путь.

person Jasper Blues    schedule 03.07.2014
comment
NB: в документации это ограничение четко не определено — мы это исправили. - person Jasper Blues; 03.07.2014
comment
Джаспер, ты передаешь селектор для геттера. Это правильно? - person Eugen Martynov; 03.07.2014
comment
@EugenMartynov Я обычно использую селектор геттера (он же имя свойства), но вы можете использовать любой из них. - person Jasper Blues; 03.07.2014