美文网首页
基础:OC方法定义可变参数

基础:OC方法定义可变参数

作者: 喔牛慢慢爬 | 来源:发表于2021-04-28 14:55 被阅读0次

    可变参数函数是指定义的函数可以拥有不定个数的参数,函数可以接收多个参数。以下是OC中常用的系统定义的可变参数函数:

    + (instancetype)stringWithFormat:(NSString *)format, ... NS_FORMAT_FUNCTION(1,2);
    void NSLog(NSString *format, ...) NS_FORMAT_FUNCTION(1,2)
    - (instancetype)initWithTitle:(nullable NSString *)title message:(nullable NSString *)message delegate:(nullable id)delegate cancelButtonTitle:(nullable NSString *)cancelButtonTitle otherButtonTitles:(nullable NSString *)otherButtonTitles, ... NS_REQUIRES_NIL_TERMINATION
    

    如何在自定义的方法中使用可变参数呢?下面用代码展示:

    //声明方法
    - (void)appendString:(NSString *)string otherString:(NSString *)otherStr, ...{
        NSString *resultStr = string;
        if (otherStr) {
            //取出第一个参数
            resultStr = [resultStr stringByAppendingFormat:@" %@",otherStr];
            //定义一个指向可变参数列表的指针
            va_list args;
            //定义一个用于保存可变参数的临时变量
            NSString *argStr;
            //初始化变量刚定义的va_list变量
            va_start(args, otherStr);
            //遍历全部参数,第二个参数为返回类型
            while ((argStr = va_arg(args, NSString *))) {
                resultStr = [resultStr stringByAppendingFormat:@" %@",argStr];
            }
            //释放列表指针,清空参数列表
            va_end(args);
        }
        NSLog(@"%@",resultStr);
    }
    //调用方法
    [self appendString:@"拼接:" otherString:@"Hello",@"World",@"OK",@"!",nil];
    
    

    注意:在调用带有可变参数的方法时,可变参数的最后一个参数需要传nil表示参数结束,否则会出现问题;

    va_list使用相关

    当我们需要读取 可变参数列表 时,必须先指定一个变数 va_list ,然后使用宏 va_start 、va_arg、va_end 来获取。

    var_list是C语言中处理变参问题的一种方式:

    • 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结尾的检查。

    Swift方法定义可变参数(不定参数)

    参考:iOS可变参数(不定参数)的用法

    相关文章

      网友评论

          本文标题:基础:OC方法定义可变参数

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