首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >方法和可选参数

方法和可选参数
EN

Stack Overflow用户
提问于 2012-06-16 22:00:34
回答 2查看 5.3K关注 0票数 3

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

接受可变数量参数的

方法也是可能的,尽管它们比较少见。额外的参数在方法名称结束后用逗号分隔。(与冒号不同,逗号不被视为名称的一部分。)在下面的示例中,向假想的makeGroup:方法传递了一个必需参数(组)和三个可选参数:

代码语言:javascript
运行
复制
[receiver makeGroup:group, memberOne, memberTwo, memberThree];

有人能告诉我们什么时候使用这个功能吗?Apple中有什么例子吗?

谢谢

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-06-16 22:11:03

您所描述的方法的类型称为变量方法。Cocoa中的例子包括+[NSArray arrayWithObjects:]+[NSDictionary dictionaryWithObjectsAndKeys:]。使用stdarg.h中定义的宏访问变量方法(或函数)的参数。

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

代码语言:javascript
运行
复制
+ (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];
}
票数 10
EN

Stack Overflow用户

发布于 2012-06-16 22:55:35

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

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

这种方法的一个主要缺点是,以逗号分隔的参数列表不进行类型检查,并且没有像在正常方法中那样有标签。

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11067358

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档