我需要一种动态地将一组参数应用于块的方法。该块可以具有任何类型的任意数量的参数。
我知道数组中参数的数量和类型是一致的。
我已经看过将块转换为CTBlockLiteral
。这样可以访问invoke
方法。
可以像这样调用带有签名(void(^)(NSString* arg0,NSString* arg1))
的块:blockRef->invoke(nil, @"foo", @"bar");
。
如何将它推广到任何数量的参数,其中arity和type在编译时是未知的?
编辑:要清楚,不,我不想改变我的块来接受varargs,数组或其他什么。这些块可以有他们想要的任何签名,我在数组中有参数。如何将这些参数传递给块?感觉我想要类似于Javascript' apply
函数。
答案 0 :(得分:0)
有几种方法可以做到这一点
1)使用省略号,在C中也称为变量参数 2)传递字典/集合作为参数 3)传递封装数据的对象。
(void(^)(id allMyArgs)) {
NSArray *args = (NSArray *)allMyArgs;
...
}
可以像这样调用:
NSArray *aux = @[ arg1, arg2, ... argN ];
blockRef->invoke(nil, aux);
不改变签名,使用指针参数将指针传递给数组:
NSArray *aux = @[ arg1, arg2, ... argN ];
NSString *par = (NSString *)aux;
blockRef->invoke(nil, par, @"bar");
定义块并访问参数
(void(^)(NSString* arg0,NSString* arg1)) {
NSArray *pars = (NSArray*)args0;
...
}