3

我在 Apple 文档中读到我们可以在目标 c 方法调用中使用可选参数。Apple 文档中的示例:

采用可变数量参数的方法也是可能的,尽管它们很少见。额外的参数在方法名称的末尾用逗号分隔。(与冒号不同,逗号不被视为名称的一部分。)在以下示例中,虚构的 makeGroup: 方法传递了一个必需参数(组)和三个可选参数:

[receiver makeGroup:group, memberOne, memberTwo, memberThree];

有人可以告诉何时使用此功能以及如何使用?Apple API中有任何示例吗?

谢谢

4

2 回答 2

10

您描述的方法类型称为可变参数方法。Cocoa 中的示例包括+[NSArray arrayWithObjects:]+[NSDictionary dictionaryWithObjectsAndKeys:]。您可以使用定义在stdarg.h.

+[NSArray arrayWithObjects:]以下是如何实现该方法的示例:

+ (NSArray *)arrayWithObjects:(id)firstObject, ... {
    int count = 0;
    va_list ap;
    va_start(ap, firstObject);
    id object = firstObject;
    while (object) {
        ++count;
        object = va_arg(ap, id);
    }
    va_end(ap);

    id objects[count];
    va_start(ap, firstObject);
    object = firstObject;
    for (int i = 0; i < count; ++i) {
        objects[i] = object;
        object = va_arg(ap, id);
    }
    va_end(ap);

    return [self arrayWithObjects:objects count:count];
}
于 2012-06-16T22:11:03.837 回答
0

我已经写过一次或两次这样的方法。这有点痛苦。它的工作方式非常类似于在 C 程序中解析命令行。

我现在不记得在哪里找到了有关如何操作的文档。如果我没记错的话,它使用函数 va_start() 和 va_end()。

这种方法的一个主要缺点是逗号分隔的参数列表没有经过类型检查,并且没有像在普通方法中那样的标签。

使用这种方法的主要方法是在像 NSArray 的 arrayWithObjects 这样的方法中,您需要允许任何类型的可变大小的参数列表或 NSLog。

于 2012-06-16T22:55:35.923 回答