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将值展开到原语中。(支持所有原语值,请参阅)感谢您的澄清