动态地将一组参数应用于块

时间:2014-10-20 07:58:49

标签: objective-c objective-c-blocks

我需要一种动态地将一组参数应用于块的方法。该块可以具有任何类型的任意数量的参数。

我知道数组中参数的数量和类型是一致的。

我已经看过将块转换为CTBlockLiteral。这样可以访问invoke方法。

可以像这样调用带有签名(void(^)(NSString* arg0,NSString* arg1))的块:blockRef->invoke(nil, @"foo", @"bar");

如何将它推广到任何数量的参数,其中arity和type在编译时是未知的?

编辑:要清楚,不,我不想改变我的块来接受varargs,数组或其他什么。这些块可以有他们想要的任何签名,我在数组中有参数。如何将这些参数传递给块?感觉我想要类似于Javascript' apply函数。

1 个答案:

答案 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;

   ...
}