【问题标题】:Objective-C function with default parameters? [duplicate]具有默认参数的Objective-C函数? [复制]
【发布时间】:2011-01-27 00:32:45
【问题描述】:

可能的重复:
Optional arguments in Objective-C 2.0?
Objective-C Default Argument Value

我正在用 Objective-C 编写一个 C 函数。我想为我的最后一个参数设置一个 默认值

我试过了:

foo(int a, int b, int c = 0);

但那是 C++。

我也试过了:

foo(int a, int b, int c)
{
    ...
}

foo(int a, int b)
{
   foo(a, b, 0);
}

但这也是 C++。

有没有办法在 Objective-C 中做到这一点?

【问题讨论】:

标签: objective-c function parameters default-value


【解决方案1】:

您可以编写具有可变长度参数列表的 C 函数。您可以使用“...”作为函数声明的参数之一的数据类型,以指定变量参数列表在参数列表中的哪个位置开始。 (这允许您在列表开始之前有一个或多个必需的参数。)

printf() 是使用此工具(称为可变参数)编写的函数示例。

printf(const char *restrict format, ...);

这里,第一个参数是必需的,然后可以跟零个或多个附加参数。

如果您以这种方式编写函数,它可以为缺少的参数提供默认值。

【讨论】:

    【解决方案2】:

    ObjC 中没有默认参数。

    您可以创建 2 个方法:

    -(void)fooWithA:(int)a b:(int)b c:(int)c {
      ...
    }
    -(void)fooWithA:(int)a b:(int)b {
      [self fooWithA:a b:b c:0];
    }
    

    对于 C :使用 ObjC 没有什么特别的添加到 C 子集中。在纯 C 中无法完成的任何事情也无法通过在 ObjC 中编译来完成。这意味着,您不能有默认参数,也不能重载函数。改为创建 2 个函数。

    【讨论】:

    • @Kenny,是的,但这并不真正属于任何类别。它确实是一个独立的 C 函数...
    • 然后按照 Seva 的建议,试试 Objective-C++。有了它,您将能够混合 C++ 和 Obj-C 代码,相互调用,等等... :)
    • 我已将头文件扩展名更改为hh,将源文件扩展名更改为mm,并且在项目设置中将compile source as according to file type extension 设置为编译为objective-C++。但它仍然显示C does not support default argumentsobjective-C++ 头文件的正确扩展名是什么?
    • @neckTwi mm。但是,如果hh 包含在非 ObjC++ 文件中,则可能会发生错误。
    • 上帝保佑!!!让它成为 Objective-C++,你将永远承受 C++ 的诅咒。例如。您不能将二进制文件部署给其他人,因为他们需要完全按照您的方式编译自己的代码。相同的编译器、运行时库和设置。 C++ 没有标准/一致的 ABI。 OBJ-C 是“纯 C”的最强有力的原因 - 是拥有一个“永远兼容”的二进制文件,它可以在任何地方运行。仅当您需要从 Obj-C 接口 C++ 代码时才使用 Obj-C++。当然不是为了节省一些简单易懂的代码行。如果你都追求优雅 - 改用 Swift(并享受与 C++ 相同的风险)
    【解决方案3】:

    对于 C 函数 - 不。对于 Objective C 类方法 - 是的,您只需执行两种方法,其中一种是短参数,另一种是调用方法。

    或者您可以将源代码重命名为 .mm,C 函数就会神奇地变成 C++。

    【讨论】:

    • 这是一个有趣的可能性......我必须在我的集成的其他部分计算出它的成本......
    • 请注意,这会更改全局名称装饰。您将无法从 .m/.c 源外部调用此类函数;如果有办法将函数声明为“extern C++”,可以这么说,我不熟悉它。换句话说,如果你要使用 ObjC++,你最好在整个项目中这样做。
    【解决方案4】:

    不,objective-c 不支持默认参数。见similar question

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-10-26
      • 1970-01-01
      • 2011-01-06
      • 1970-01-01
      • 1970-01-01
      • 2010-11-16
      • 2018-04-08
      • 1970-01-01
      相关资源
      最近更新 更多