简介

一个可变参数函数是指一个函数拥有不定的参数,即为一个函数可接收多个参数。有时我们会遇到一些算术问题需要用到,比如是计算传入参数的总和,字符串的连接或是其它操作过程,我们在 OC 里也经常使用,最经典的就是 NSLog( C 为 printf ) ,它可以指定格式的输出,格式化输出的内容。

举个栗子?

新建一个类TestClass,写一个类方法print:用于输出我们传入的值

类头文件TestClass.h

#import <Foundation/Foundation.h>@interface TestClass : NSObject
+ (void)print:(NSString *)firstArg, ... NS_REQUIRES_NIL_TERMINATION;
@end

类实现TestClass.m

#import "TestClass.h"@implementation TestClass+ (void)print:(NSString *)firstArg, ... NS_REQUIRES_NIL_TERMINATION {if (firstArg) {// 取出第一个参数NSLog(@"%@", firstArg);// 定义一个指向个数可变的参数列表指针;va_list args;// 用于存放取出的参数NSString *arg;// 初始化变量刚定义的va_list变量,这个宏的第二个参数是第一个可变参数的前一个参数,是一个固定的参数va_start(args, firstArg);// 遍历全部参数 va_arg返回可变的参数(a_arg的第二个参数是你要返回的参数的类型)while ((arg = va_arg(args, NSString *))) {NSLog(@"%@", arg);}// 清空参数列表,并置参数指针args无效va_end(args);}
}@end

va_list:用来保存宏 va_start 、va_arg 和 va_end 所需信息的一种类型。为了访问变长参数列表中的参数,必须声明 va_list 类型的一个对象。

va_start:访问变长参数列表中的参数之前使用的宏,它初始化用va_list声明的对象,初始化结果供宏va_arg和va_end使用;

va_arg:展开成一个表达式的宏,该表达式具有变长参数列表中下一个参数的值和类型。每次调用 va_arg 都会修改,用 va_list 声明的对象从而使该对象指向参数列表中的下一个参数。

va_end:该宏使程序能够从变长参数列表用宏 va_start 引用的函数中正常返回。

NS_REQUIRES_NIL_TERMINATION :是一个宏,用于编译时非nil结尾的检查。

试一试

在外部调用一个刚刚写的方法

注意:

  • 在可变参数里,所有参数均用逗号隔开
  • 参数结尾必须加上nil,表示参数结束
#import <Foundation/Foundation.h>
#import "TestClass.h"int main(int argc, const char * argv[]) {[TestClass print:@"a", @"b", @"c", nil];return 0;
}

看一下执行的结果,输出了我们预期的值

参考:ios开发-Object-C可变参数函数

转载于:https://www.cnblogs.com/lancely/p/5782798.html

iOS-可变参数(不定参数)的用法相关推荐

  1. 函数参数 不定参数,和 默认参数

    实现查找一个字符串中是否包含若干"子串" function containsAll(haystack) { for (var i=1; i<arguments.length; ...

  2. iOS 实现不定参数方法

    在iOS要实现不定参数的函数,有一个方案是用C/C++中的va_list.va_start.va_arg.va_end来实现.这样实现需要一个哨兵参数,就是调用方法是最后必须要加一个nil或者0的参数 ...

  3. 4.默认参数,不定参数,扩展参数

    // 1.默认参数 // var age = 18 // class Default{ // constructor(name=`dube`){ // this.name = name // } // ...

  4. iOS实现传递不定长的多个参数

    我们在使用苹果官方的文档的时候会发现可传不定数的参数例如: // [[UIAlertView alloc]initWithTitle:<#(nullable NSString *)#> m ...

  5. python args_Python可变参数*args和**kwargs用法实例小结

    本文实例讲述了Python可变参数*args和**kwargs用法.分享给大家供大家参考,具体如下: 一句话简单概括:当函数的参数不确定的时候就需要用到*args和**kwargs,前者和后者的区别在 ...

  6. 可变参数(不定项参数)

    可变参数(不定项参数) JDK1.5开始,java支持传递同类型的可变参数给一个方法. 在方法声明,在指定参数类型后加一个省略号(-). 一个方法中只能指定一个可变参数,它必须是方法最后一个参数.任何 ...

  7. java 不定参数_java中不定长参数的实例用法

    java中不定长参数的使用方法 不定长参数方法的语法如下: 返回值 方法名(参数类型...参数名称) 在参数列表中使用"..."形式定义不定长参数,其实这个不定长参数a就是一个数组 ...

  8. Golang 函数定义 不定数目参数定义 多个输入参数函数 (...) 不定参数 可变参数 定义

    使用 三点水 - 号 定义 Golang 中的不定参数 使用语法: 不定参数集合名 - (不定参数集合)数据类型 示例: package mainimport "fmt"func ...

  9. C技巧:结构体参数转成不定参数

    下面这段程序是一个C语言的小技巧,其展示了如何把一个参数为结构体的函数转成一个可变参数的函数,其中用到了宏和内建宏"__VA_ARGS__",下面这段程序可以在GCC下正常编译通过 ...

  10. c语言int val,c语言不定参数与printf函数的实现

    今天学习了C语言不定参数,C语言中的不定参数主要靠这个头文件实现,这个头文件包含了va_list().va_start().va_end()三个宏,其用法为先声明一个va_list类型的变量,它用于访 ...

最新文章

  1. ECMAScript5.1的运算符、类型转换总结
  2. 若川诚邀你加源码共读群,每周一起学源码
  3. 织梦网站上传服务器不显示图片,解决织梦后台登陆不显示验证码图片问题
  4. python调用adb shell命令_Python之使用adb shell命令启动应用的方法详解
  5. 删除github上的commit历史记录
  6. ThinkPHP5.0 漏洞测试
  7. JSP初学大全!!带连接数据库例子
  8. Linux篇:shell脚本监控主机状态的3种方式
  9. -xdebug java8_多种高级debug方法,帮你更快定位问题
  10. C#ORM系统 Moon.ORM使用方法
  11. 基于Python从头开始使用 RMSProp 进行梯度下降
  12. 洛谷P2525 Uim的情人节礼物·其之壱(组合数学/上一个全排列/下一个全排列)
  13. 水清冷冷:Photoshop CC 2020/PSCC 2020安装教程及学习技巧(附工具)
  14. android 白色透明度,Android 透明度alpha换算表
  15. 现代轻奢风格装修讲解
  16. 假期之不务正业—— Qt+FFmpeg+百度api进行视频的语音识别
  17. 在Ubuntu 16.04下安装g2o
  18. indesign java_InDesign必杀技,分分钟秒出方案排版(附ID排版模板)
  19. Android SAF(Storage Access Framework)使用攻略
  20. 爱了,爱了,一款拯救直男的开源神器!

热门文章

  1. css中实现ul两端的li对齐外面边缘
  2. H5——while循环,for循环
  3. 趣味SQL:用SQL计算瓷砖费用
  4. oracle快速复制表数据
  5. jqGrid如何设置jqGrid第一次初始化时不加载任何数据?实现方法!
  6. Python为何如此优秀?斯坦福教授告诉你!
  7. iOS 调用h5页面 视频不自动播放的问题
  8. 敏捷与DevOps整合之道
  9. vGPU作为主流平台的进化之路
  10. 斐波那契数与二分法的递归与非递归算法及其复杂度分析