2011-04-21 46 views
1

我有一個隨機數發生器(RNG)函數。函數注入在objective-c

-(double) generateRandomNumber 
{ 
    ... do some stuff 
    return randomNumber; 
} 

我有一個調用這個隨機數生成函數來完成任務的功能 - 沿着我想修改此,這樣的隨機數生成函數實際傳遞的

-(double) GenerateSellPrice { 
    double randomNumber; 

    randomNumber = [self generateRandomNumber]; 

    return value*randomNumber; 
} 

東西線進入GenerateSellPrice函數,以便我可以爲不同目的(即單元測試,不同範圍等)調換和調出不同的RNG。

如何聲明RNG函數,以便它可以傳遞給我(我假設爲函數指針)的形式?我如何聲明GenerateSellPrice來接受函數作爲參數?那我該如何調用這個函數呢?

+0

已經把我自己的解決方案,我將作爲其選擇更完整的答案,但是我已經給upvotes來幫助我到那裏的答案! – link664 2011-04-21 02:54:56

回答

0

使用塊進行了試驗。對於那些誰想要知道我是怎麼做的,我宣佈我的RNG在我調用類(ClassA的)作爲一類變量

double(^generateRandomNumber)(void) = ^{ 
    ...do stuff; 
    return randomNumber; 
}; 

然後在我的稱爲類(ClassB的)聲明我的函數

-(double) generateSellPriceWithGenerator:(double(^)(void))generator { 
    double randomNumber; 

    randomNumber = generator(); 

    return value*randomNumber; 
} 

,然後簡單地稱爲從ClassA的功能,像這樣

double (^func)(void) = generateRandomNumber; 
double value = [classB generateSellPriceWithGenerator:func]; 
1

最簡單的方法是使用「選擇器」對象。一旦你有一個選擇對象,你可以通過執行以下

@selector(generateRandomNumber) 

聲明一個選擇,你可以使用

SEL randomNumberFunction; // Most likely passed in as a parameter 
NSObject *generatorObject; 
[generatorObject performSelector:randomNumberFunction]; 
2

經典的Objective-C的模式是採取一個選擇器(SEL)和客體( id)論點論據:

-(double) GenerateSellPriceWithRNG:(id)rngObject selector:(SEL)rngSelector 
     double randomNumber; 

     randomNumber = [rngObject performSelector:rngSelector]; 

     return value*randomNumber; 
    } 

叫它
[self GenerateSellPrinceWithRNG:self selector:@selector(generateRandomNumber)]; 

現代實踐可能會採取一個塊(double (^)())參數。塊的語法稍微有點醜,但它帶來的力量在這種情況下很有用。您可以從編譯器中獲得更好的類型檢查,並且可以方便地在內聯塊中生成塊,而不必編寫整個類的方法。

在這種情況下,你可以聲明

-(double) GenerateSellPriceWithRNG:(double (^)())rngBlock { 
    double randomNumber; 

    randomNumber = rngBlock(); 

    return value*randomNumber; 
} 

[self GenerateSellPriceWithRNG:^{ return [self generateRandomNumber]; }]; 

或與返回double任何其他模塊調用它。