具有默认参数的Objective-C函数? [复制]
Posted
技术标签:
【中文标题】具有默认参数的Objective-C函数? [复制]【英文标题】:Objective-C function with default parameters? [duplicate] 【发布时间】: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 中做到这一点?
【问题讨论】:
我相信是***.com/questions/871796/… 和/或***.com/questions/561185/… 的副本。 第一个不太有用,因为每个人要么回答方法调用,要么错误地声明你可以有两个 foo 函数。二是所有方法调用... 【参考方案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 arguments
。 objective-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
【讨论】:
以上是关于具有默认参数的Objective-C函数? [复制]的主要内容,如果未能解决你的问题,请参考以下文章
如何将 Objective-C initXXX 方法绑定到具有相同类型参数的 Xamarin.iOS 构造函数?
如何从具有隐藏变量名称(参数前的_)或内部+外部(例如 foo(with bar:))的 Objective-C 调用 Swift 函数
通过“函数参数”中的 const 类型在派生类中具有不同函数参数的虚拟函数会破坏虚拟机制吗? [复制]