Тайфун вводит свойство
У меня проблемы с введением свойства 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
использование неправильно.
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, но при вызове интерфейса assmebly вы должны использовать оболочку NSNumber:
[assembly emotionControllerWithItem:item firstController:@YES];
Как правило, вы можете вводить следующим образом:
[definition injectProperty:@selector(isFirst) with:[NSNumber numberWithBool:YES]];
Но, наверное, приятнее
[definition injectProperty:@selector(isFirst) with:@(YES)];
Однако аргументы времени выполнения имеют следующие ограничения:
- Вы не можете вызывать методы для аргумента времени выполнения.
- Аргументы времени выполнения не могут быть примитивами.
Вы можете либо обойти это, либо вернуться к написанию собственного фабричного класса, который будет использоваться вместо интерфейса сборки.
Ответ @Aleksey показывает обходной путь.