[iOS]Objective-C与Swift中可变参数列表

一般一个函数的一个参数只能接收一个值, 如果某个参数有多个值的话, 会使用数组, 这就给使用的时候带来一些不方便. 如果还想使用原类型, 又想可变, 这就需要定义为可变类型.
在Objective-C和Swift中的可变参数的定义及使用, 有一些区别, 下面来分别介绍:

Objective-C 函数的可变参数(va_list)

Objective-C中的可变参数需要用到C语言的va_list变量, 大致步骤分为四个:

  1. 定义va_list 类型变量;
  2. 使用 va_start 宏开始遍历所有值;
  3. 使用va_arg 宏获取遍历到的值;
  4. 使用 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中, 可变参数只能是函数的最后一个参数, 且只能有一个.

(完)

你可能感兴趣的:([iOS]Objective-C与Swift中可变参数列表)