iOS可变参数

作者: 小道萧兮 | 来源:发表于2017-02-20 17:26 被阅读360次

一、可变参数是什么

想定义一个方法,但是不知道以后要用的时候想传几个参数进去,最经典的例子就是UIAlertView的构造方法
在Objective-C中:

- (instancetype)initWithTitle:(nullable NSString *)title message:(nullable NSString *)message delegate:(nullable id /*<UIAlertViewDelegate>*/)delegate cancelButtonTitle:(nullable NSString *)cancelButtonTitle otherButtonTitles:(nullable NSString *)otherButtonTitles, ... NS_REQUIRES_NIL_TERMINATION

在Swift中:

public convenience init(title: String, message: String, delegate: UIAlertViewDelegate?, cancelButtonTitle: String?, otherButtonTitles firstButtonTitle: String, _ moreButtonTitles: String...)

下面我将分别用Objective-C和Swift实现。

二、Objective-C实现可变参数

首先必须了解各个宏的功能是什么:

  1. NS_REQUIRES_NIL_TERMINATION:是一个宏,用于编译时非nil结尾的检查。 调用时要以nil结尾,否则会崩溃。
  2. va_list:用于声明一个变量,函数的可变参数列表其实就是一个字符串,所以va_list才被声明为字符型指针,这个类型用于声明一个指向参数列表的字符型指针变量,例如:va_list ap; //ap:arguement pointer
  3. va_start(ap,v):它的第一个参数是指向可变参数字符串的变量,第二个参数是可变参数函数的第一个参数,通常用于指定可变参数列表中参数的个数。
  4. va_arg(ap,t):它的第一个参数指向可变参数字符串的变量,第二个参数是可变参数的类型。
  5. va_end(ap):用于将存放可变参数字符串的变量清空(赋值为NULL)。
// .h文件中
- (NSString *)addMoreArguments:(NSString *)firstStr,...NS_REQUIRES_NIL_TERMINATION;

// .m文件中
- (NSString *)addMoreArguments:(NSString *)firstStr,...
{
    //定义一个指向个数可变的参数列表指针
    va_list args; 
    // 获取第一个可选参数的地址.使参数列表指针指向函数参数列表中的第一个可选参数
    va_start(args, firstStr);
    NSMutableString *allStr = [NSMutableString string];
    // 遍历参数,直到等于nil时结束
    for (NSString *str = firstStr; str != nil; str = va_arg(args, NSString *)) {
        [allStr appendFormat:@"%@",str];
    }
    // 清空参数列表,并置参数指针args无效
    va_end(args);
    return allStr;
}

三、Swift实现可变参数

Swift的实现比Objective-C简单太多太多

func addMoreArguments(firstStr: String...) {
      var result = String()
      // 遍历参数
      for str in firstStr {
          result += str
      }
      print(result)
}

这是用Swift实现与Objective-C完全相同功能的代码,哪个简单?不言而喻~~

相关文章

  • iOS可变参数实现及原理剖析

    iOS可变参数实现及原理剖析 标签(空格分隔): iOS可变参数 iOS方法后面为什么有nil参数 你一定会时常见...

  • iOS可变参数

    一、可变参数是什么 想定义一个方法,但是不知道以后要用的时候想传几个参数进去,最经典的例子就是UIAlertVie...

  • 元组、字典可变参数

    可变参数 需求: 参数数量不确定,能否接收? args元组可变参数 kwargs字典可变参数 传递可变参数

  • 函数参数

    1、可变参数,参数个数可变 在参数前面加上* 就代表可变参数 可变参数,在函数内部其实就是一个tuple def ...

  • ★10.关于可变参数模板

    可变参数函数模板 可变参数类模板 可变参数函数模板的使用 转发参数包

  • 函数的,参数,变量作用域,递归,匿名函数

    一:函数参数的介绍 1:可变和不可变参数 1.1:必选参数 1.2:默认参数 1.3:可变参数 1.4:关键字参数...

  • Go语言可变参数

    可变参数 参数数量可变的函数称为可变参数函数 在声明可变参数函数时,需要在参数列表的最后一个参数类型之前加上省略符...

  • 可变参数列表

    可变参数列表 数组可以向可变参数传值,反之,不行 可变参数列表作为参数时只能放在参数的最后面 可变参数列表的方法是...

  • python函数回顾

    1.参数的介绍 (1)可变和不可变参数 (2)必选参数 (3)默认参数 (4)可变参数 (5)关键字参数 1.1....

  • Python参数 * 与 ** ,及装包拆包

    (*args)可变参数在Python函数中,还可以定义可变参数。顾名思义,可变参数就是传入的参数个数是可变的,可以...

网友评论

    本文标题:iOS可变参数

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