Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 台风注入特性_Ios_Objective C_Inject_Typhoon - Fatal编程技术网

Ios 台风注入特性

Ios 台风注入特性,ios,objective-c,inject,typhoon,Ios,Objective C,Inject,Typhoon,我在注入布尔财产方面有问题 我试过下一步: - (id)emotionControllerWithItem:(MDDiaryItem *)item firstController:(BOOL)isFirst { return [TyphoonDefinition withClass:[MDEmotionViewController class] configuration: ^(TyphoonDefinition *definition

我在注入布尔财产方面有问题

我试过下一步:

- (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\u BAD\u访问时崩溃。实际上,它与BOOL属性无关,而是具有值本身的注入属性。看来我对台风使用的假设是错误的。

通常你可以按如下方式注入:

[definition injectProperty:@selector(isFirst) with:[NSNumber numberWithBool:YES]];
但可能更好:

[definition injectProperty:@selector(isFirst) with:@(YES)];
但是,运行时参数有以下限制:

  • 不能对运行时参数调用任何方法
  • 运行时参数不能是基元
您可以解决这个问题,或者返回编写自己的factory类来代替汇编接口


@Aleksey的答案显示了一种变通方法

通常,您可以按如下方式进行注射:

[definition injectProperty:@selector(isFirst) with:[NSNumber numberWithBool:YES]];
但可能更好:

[definition injectProperty:@selector(isFirst) with:@(YES)];
但是,运行时参数有以下限制:

  • 不能对运行时参数调用任何方法
  • 运行时参数不能是基元
您可以解决这个问题,或者返回编写自己的factory类来代替汇编接口


@Aleksey的答案显示了一种变通方法

运行时参数必须始终是对象,而不是基元类型

正确的总成如下所示:

- (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];

运行时参数必须始终是对象,而不是基元类型

正确的总成如下所示:

- (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];

你说“它不起作用”是什么意思?不编译吗?运行时错误?意外行为?注意:请参阅@Aleksey的答案,并注意,对于Typhone 2.1.2(刚刚推出),它将检测您是否定义了基本运行时参数、是否提前失败并建议解决方案。你说“它不起作用”是什么意思?不编译吗?运行时错误?意外行为?注意:请参阅@Aleksey的答案,并注意,对于Typhone 2.1.2(刚刚推出),它将检测您是否定义了基本运行时参数、是否提前失败并建议解决方案。注意:文档没有明确定义这个限制-我们已经纠正了。Jasper,你把选择器传递给getter。这是正确的吗?@EugenMartynov我通常使用getter选择器(也称为属性名),但您可以使用其中任何一个。注意:文档没有明确定义此限制-我们已经更正了。Jasper,您将选择器传递给getter。这是正确的吗?@EugenMartynov我通常使用getter选择器(也称为属性名),但您可以使用其中任何一个。Aleksey,这是对Typhone还是objective-c的限制?我不明白台风的局限性从何而来。需要传递所有值以作为对象注入。现在我们添加了参数类型检查,并在原语运行时参数使用时引发异常。另外请注意,如果目标具有原语类型,则类似于KVC将值展开到原语中。(支持所有原始值,请参阅)感谢澄清Eksey,这是对台风还是objective-c的限制?我不明白台风的局限性从何而来。需要传递所有值以作为对象注入。现在我们添加了参数类型检查,并在原语运行时参数使用时引发异常。另外请注意,如果目标具有原语类型,则类似于KVC将值展开到原语中。(支持所有原语值,请参阅)感谢您的澄清