【问题标题】:Methods and optional parameters方法和可选参数
【发布时间】:2012-06-19 12:12:14
【问题描述】:

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

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

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

谁能告诉我何时使用此功能以及如何使用? Apple API 中是否有任何示例?

谢谢

【问题讨论】:

标签: objective-c ios


【解决方案1】:

您所描述的方法类型称为variadic 方法。 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];
}

【讨论】:

  • 比我的答案要好得多。 (投票赞成)。我无法追查细节。它不在文档中,如果您不知道要查看哪个头文件,那您就不走运了。
  • 请注意,方法的可变参数应该非常谨慎地使用。编译器无法正确类型检查参数。一般来说,最好有非常具体的论据(当然,可变参数可能非常有用)。
【解决方案2】:

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

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-04-11
    • 1970-01-01
    • 1970-01-01
    • 2019-03-08
    • 1970-01-01
    • 2015-05-17
    • 1970-01-01
    相关资源
    最近更新 更多