2014-10-20 15 views
0

我需要一種將塊數參數動態應用於塊的方法。該塊可以具有任何類型的任意數量的參數。動態地將參數數組應用於塊

我知道數組中參數的數量和類型會一致。

我已經看過將這個塊扔到CTBlockLiteral。這提供了對invoke方法的訪問。

帶有簽名(void(^)(NSString* arg0,NSString* arg1))的塊可以這樣調用:blockRef->invoke(nil, @"foo", @"bar");

這怎麼可以推廣到任何數量的參數,其中arity和類型在編譯時不知道?

編輯:爲了清楚,不,我不想改變我的塊接受可變參數,數組或其他。這些塊可以有他們想要的任何簽名,並且我有一個數組中的參數。我如何將這些參數傳遞給塊?這感覺就像我想要的東西類似於Javascript的apply函數。

+0

使用var ARGS? https://gist.github.com/JacobOscarson/2783763 – 2014-10-20 08:13:05

+0

@GuillaumeAlgis不,該塊需要幸福地意識到這一切已經發生。 – funkybro 2014-10-20 09:14:34

+0

聽起來像你問「我如何在Objective-C中使用塊來重現Javascript'apply'功能?」塊不適合這個。可能是'NSInvocation',取決於你想要做什麼。你能描述一下你試圖解決的更廣泛的商業問題嗎? – Rob 2014-10-21 03:38:07

回答

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; 

    ... 
} 
+0

對,這不是我所需要的。我的塊可能看起來像這樣('(void(^)(NSString * arg0,int arg1)){}',或者它可能看起來像這樣(void(^)(BOOL arg0,NSString * arg1,int arg2,NSString * arg3)){}',我不在乎。我想要做的就是將參數應用於它。 – funkybro 2014-10-20 08:51:18

+0

在這種情況下,請使用省略號,如https://developer.apple.com/library/mac/qa/qa1405/_index.html – Joao 2014-10-21 00:33:05

+0

中所述。我真的不認爲這是我所需要的。你能舉一個例子說明如何使用省略號來調用帶有簽名'(void(^)(NSString * arg0,int arg1)){}'的塊,而不改變塊的簽名? – funkybro 2014-10-21 09:23:15