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

У меня проблемы с введением свойства 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 показывает обходной путь.

Другие вопросы по тегам