为什么objective-c数组参数不使用冒号表示法?

为什么objective-c数组参数不使用冒号表示法?,objective-c,Objective C,我现在正在从大牧场指南中学习一些objective-c。我的理解是,具有多个参数的方法使用冒号分隔每个参数,但在阅读有关创建数组的内容时,我发现了以下代码片段: NSArray *dateList = [NSArray arrayWithObjects:now, tomorrow, yesterday, nil]; 这让我感到困惑,因为我认为objective-c方法参数的前面必须有一部分方法名和冒号。有人能给我解释一下吗?这是一个例外;这通常被称为一个。如果您查看NSArray.h中的定义

我现在正在从大牧场指南中学习一些objective-c。我的理解是,具有多个参数的方法使用冒号分隔每个参数,但在阅读有关创建数组的内容时,我发现了以下代码片段:

 NSArray *dateList = [NSArray arrayWithObjects:now, tomorrow, yesterday, nil];

这让我感到困惑,因为我认为objective-c方法参数的前面必须有一部分方法名和冒号。有人能给我解释一下吗?

这是一个例外;这通常被称为一个。如果您查看NSArray.h中的定义:

+ (instancetype)arrayWithObjects:(id)firstObj, ... NS_REQUIRES_NIL_TERMINATION;
您可以看到,您可以指定任意数量的参数,只要最后一个参数是
nil
(这称为)

这样可以避免开发人员创建大量具有大致相同功能的不同方法,每个方法都接受不同数量的参数。他们是在
NSObject
中这样做的,在这里您可以

- (id)performSelector:(SEL)aSelector withObject:(id)object1;
- (id)performSelector:(SEL)aSelector withObject:(id)object1 withObject:(id)object2;

(但没有其他方法)。

该方法只有一个参数,即可变参数列表

以下是苹果开发者网站上的Objective-C声明:

+ (instancetype nonnull)arrayWithObjects:(ObjectType nonnull)firstObj, ...;

不需要冒号分隔,因为对象列表被视为一个参数,即使它看起来像许多参数

你跑得很快,我很嫉妒。该死的这些精灵破坏了大家的乐趣!:–)值得一提的是,这是C语言的一个遗留版本,它允许这种任意参数长度的函数调用行为,主要是为
printf
之类的东西创建的,并且受到一些语法限制,在被调用方解包时有些麻烦。现代的ObjC当然可以在没有这种语法的情况下存在(而不是使用数组文字),但你会不时看到它。与下面的答案完全不同:这有一种更现代的语法,只不过是
@[现在、明天、昨天]
。如果
现在
明天
昨天
中没有一个是
,那么这在功能上与
+[NSArray arraywhithobjects:][/code>表单相同。