一般一个函数的一个参数只能接收一个值, 如果某个参数有多个值的话, 会使用数组, 这就给使用的时候带来一些不方便. 如果还想使用原类型, 又想可变, 这就需要定义为可变类型.
在Objective-C和Swift中的可变参数的定义及使用, 有一些区别, 下面来分别介绍:
Objective-C 函数的可变参数(va_list)
Objective-C中的可变参数需要用到C语言的va_list变量, 大致步骤分为四个:
- 定义va_list 类型变量;
- 使用 va_start 宏开始遍历所有值;
- 使用va_arg 宏获取遍历到的值;
- 使用 va_end 结束遍历;
参数的定义方式是, 在参数名称后面由逗号隔开, 加上三个点(…); 一个函数只能有一个可变参数, 一定要是函数的最后一个参数, 如果函数有多个参数, 只能把最后一个参数设置为可变的.
例如, 设置一个可变的字符串类型参数:
- (void)mutiStr:(NSString *)strings,... {
va_list args;
va_start(args, strings);
if (strings) {
// 获取第一个值
NSString *result = strings;
while (result) {
NSLog(@"%@", result);
result = va_arg(args, NSString *);
}
}
va_end(args);
NSLog(@"END");
}
一些说明:
va_list args:定义一个指向参数列表的指针;
va_start(args,strings):将指针指向可变参数列表, 即指向strings的首地址, 这时指向的是第一个值的地址(首地址), 其值就是参数列表的第一个值;
va_arg(args,NSString *):获取当前指针指向的值, 并指定其类型, 这里为NSString类型;
a_end(args):遍历完成后, 释放指针;
使用
使用的时候, 在可变参数的列表后面一定要加上 nil 作为结束标识:
[self mutiStr:@"string1", @"string2", @"string3", nil];
这时的输出为:
string1
string2
string3
END
下面附加一个整形参数的可变示例:
- (void)mutiInt:(int)num,... {
va_list args;
va_start(args, num);
if (num) {
int result = num;
while (result) {
NSLog(@"%d", result);
result = va_arg(args, int);
}
}
va_end(args);
}
使用:
[self mutiInt:100, 20, 30, 2, nil];
Swift中可变参数
在Swift中, 可变参数是在变量类型后面加上三点(…)来定义的, 不过, 这样其实是将传进来的多个变量组合成为一个数组, 使用的时候不能直接使用, 需要遍历数组来取出相应的值:
func mutiStr(_ strs: String...) {
for s in strs {
// 将传进来的变量取出来
print(s)
}
print("end")
}
使用:
mutiStr("string1", "string2", "string3")
同样, 在Swift中, 可变参数只能是函数的最后一个参数, 且只能有一个.