使用NSArray作为参数声明函数

时间:2011-11-16 21:51:15

标签: objective-c ios function nsarray

我的功能如下:

-(int)ladderCalc:(NSArray*)amounts percentages:(NSArray*)percentages amount:(int)amount
{

   // Do some stuff

   return foo;
}

我在头文件中声明了这样的内容:

-(int)ladderCalc:(NSArray*)amounts percentages:(NSArray*)percentages amount:(int)amount;

但是当我尝试使用同一文件中其他地方返回的int值时,我收到错误“c99中隐式声明函数无效”。我没有正确宣布这项功能吗?

更新

我意识到我没有以标准化的方式宣布这一点,我将我的声明改为MarkGranoff的推荐(见上面的更改),但这次我仍然将其作为警告。

以下是我如何调用此函数的上下文:

-(int)fooTotal: (int)amount 
{

   int totalFee = 0;

   // Declare arguments
   NSArray *percentages = [[NSArray alloc] initWithObjects:firstValue, secondValue, thirdValue, fourthValue, fifthValue, nil];
   NSArray *amounts = [[NSArray alloc] initWithObjects:sixthValue, seventhValue, eigthValue, ninthValue, nil];

   totalFee = ladderCalc(amounts,percentages,amount);

   return totalFee;
}

所以,即使就Obj-C风格而言,这似乎仍然有意义,我仍然会收到警告。

我很确定我没有正确调用此函数,在编译项目时遇到无法识别的符号错误。

Undefined symbols for architecture i386:
  "_ladderCalc", referenced from:
      -[FeeCalcLibrary getMFModelTotal:] in FeeCalcLibrary-A83D2A7637F57664.o
ld: symbol(s) not found for architecture i386
clang: error: linker command failed with exit code 1 (use -v to see invocation)

2 个答案:

答案 0 :(得分:2)

请改为尝试:

-(int)ladderCalc:(NSArray*)amounts percentages:(NSArray*)percentages amount:(int)amount;

并更改实现的签名以匹配。然后你有一个参数,你可以在方法的代码中引用名称。即:金额,百分比和金额。

答案 1 :(得分:0)

正如@MarkGranoff所说。

Objective-C将它的参数散布在方法名称中。

对于方法声明:

-(int)ladderCalcWithAmounts:(NSArray*)amounts percentages:(NSArray*)percentages amount:(int)amount;

方法名称是(冒号是名称的一部分):

ladderCalc:percentages:amount:

散布在方法名称中的参数为:

(NSArray*)amounts
(NSArray*)percentages
(int)amount;

这提高了对“C”函数调用的可读性,可能是:

int ladderCalcPercentagesAmount(NSArray *amounts, NSArray *percentages, amount);

从技术上讲,Objective-C没有命名参数,而是散布参数。命名参数往往意味着位置并不重要,只是关联的名称,例如Python的命名参数。