方法和可选参数

时间:2012-06-16 22:00:34

标签: objective-c ios

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

  

采用可变数量参数的方法也是可能的,   虽然它们有点罕见。额外参数以逗号分隔   方法名称结束后。 (与冒号不同,逗号不是   被认为是名称的一部分。)在下面的例子中,虚构   makeGroup:方法传递一个必需参数(组)和三个   可选的参数:

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

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

感谢

2 个答案:

答案 0 :(得分: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];
}

答案 1 :(得分:0)

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

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

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

使用该方法的主要方法是在NSArray的arrayWithObjects之类的方法中,您需要允许任意类型的参数的可变大小列表,或NSLog。