美文网首页
[iOS]Objective-C与Swift中可变参数列表

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

作者: 流火绯瞳 | 来源:发表于2018-01-10 14:11 被阅读168次

    一般一个函数的一个参数只能接收一个值, 如果某个参数有多个值的话, 会使用数组, 这就给使用的时候带来一些不方便. 如果还想使用原类型, 又想可变, 这就需要定义为可变类型.
    在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中可变参数列表

          本文链接:https://www.haomeiwen.com/subject/xpznnxtx.html