2011-04-21 47 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任何其他模块调用它。