如果参数在调用时用逗号而不是冒号分割,那么函数签名是什么?

时间:2016-03-19 14:57:27

标签: objective-c

在Apple的OC教程中阅读这样的函数调用。对如何定义函数stringWithFormat或其签名有点困惑......

[NSString stringWithFormat:@"The magic number is %i", magicNumber];

相关问题是关于NSLog的

NSLog(@"%i is a number", someScalarVarNumber);

函数调用应该是

[Obj FuncName:param FuncName1:param1 FuncName2:param2];

1 个答案:

答案 0 :(得分:3)

你说:

  

[我]对如何定义函数stringWithFormat或其签名感到有点困惑。

如果您命令 - 在您的代码中点击stringWithFormat,它将直接转到您的声明(您可以点击"返回"按钮返回你的代码)。无论如何,stringWithFormat定义如下:

+ (instancetype)stringWithFormat:(NSString *)format, ... NS_FORMAT_FUNCTION(1,2);

这些省略号(...)表示它是" variadic function",它采用由逗号分隔的可变长度参数列表。这是一个C编程模式,也被纳入Objective-C。

如果您想知道,NS_FORMAT_FUNCTION提示编译器第一个参数(1)是printf - 样式格式字符串(或更准确) ,NSString使用的稍微丰富的再现,以及从第二个参数(2)开始的参数应该与格式字符串中显示的参数匹配。这使编译器可以检查您的参数列表,看它是否与格式字符串匹配。

他们觉得有必要为printf - 样式参数添加这种特殊逻辑这一事实实际上是变量参数更深层问题的线索:除了printf - 样式的情况,它&# 39;很难确保传递给函数的参数与函数期望的函数匹配。

因此,您通常只会看到可变方法声明,其中传递给方法的参数数量是可变的,并且它具有printf样式的格式字符串。 (从技术上讲,您可以在任何具有可变参数数量的情况下使用它,但在这些情况下通常有更好的方法,例如传递数组。事实上,如果您查看Apple的新Cocoa API,他们需要的地方可变数量的参数,它们通常传递一个数组,而不是使用您在一些较旧的API中看到的可变参数模式。)

所以,你是对的,我们通常会调用这样的方法:

[objectName funcName:firstValue secondParameterName:secondValue thirdParameterName:thirdValue];

但是,在特殊情况下,您可以使用variadic functions