我的功能如下:
-(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)
答案 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的命名参数。