转自: https://addicechan.github.io/...html
在Swift
中,命名一个方法参数的时候,若是有多个特定类型的参数,能够直接使用可变参数(Variadic Parameters
)。官网文档连接git
使用可变参数,其实很简单。就是在参数类型加上…
。好比Int…
。实际上,方法内部去调用该参数的话,Xcode
提示的是[Int]
。也就是一个Array
。这样也是大大方便。不用非得去声明一个[Int]
。github
小二。。上代码~~~objective-c
// 多数字相加 func add(_ values: Int...) -> Int { return values.reduce(0){ $0 + $1 } } print(add(1,5,8,9)) // 23
再好比,能够封装一个UIAlertController
。若是以为每次得写一大堆alert.addAction()
巴拉巴拉.swift
extension UIAlertController { class func show(_ vc: UIViewController?, title: String, msg: String, style: UIAlertControllerStyle ,btns: String... ,completionHandler:@escaping ((_ btnIndex: Int) -> Void)) { let alertController : UIAlertController = UIAlertController(title: title, message: msg, preferredStyle: style) for (index, element) in btns.enumerated() { alertController.addAction(UIAlertAction(title: element, style: .default, handler: { _ in completionHandler(index) })) } if style == .actionSheet { alertController.addAction(UIAlertAction(title: "cancel", style: .cancel, handler: nil)) } vc?.present(alertController, animated: true, completion: nil) } } // 使用 UIAlertController.show(self, title: "Alert", msg: "show alert", style: .alert, btns: "previous", "next") { index in print(index) }
不过,可变参数没法用于Objective-C
中。api
Objective-C
若是要使用可变参数。那么须要使用到va_list
等系列C函数
。app
小二,继续上代码~~~函数
- (NSString *)add:(NSString *)value, ... NS_REQUIRES_NIL_TERMINATION { NSMutableString *result = [NSMutableString string]; [result appendString:value]; if (value) { va_list values; // values 会从 value 的指针地址开始取值,直至nil va_start(values, value); id tempValue; while((tempValue = va_arg(values, NSString *))) { [result appendString:tempValue]; } // 记得清空 va_end(values); } return result; }
使用va_start
这个宏,会从value
的指针地址开始,一个一个的去取值。对于非指针
的话,那么就没法实现。至于 方法名后面的NS_REQUIRES_NIL_TERMINATION
,则是在方法调用的时候,加上nil
做为终结。由于若是没有nil
的话,那么也是会致使 不停的取值,因而,拿到未初始化的内存空间后,就致使崩溃啦。Boom....指针
写完这个方法后,只能感叹下Swift
封装的太好了。很方便的...
语法,加上高阶函数
的使用。貌似也不太算很公正的对比。(逃。code
func add(_ values: String...) -> String { return values.reduce(""){ $0 + $1 } }
这样几行代码,就已经实现了上述Objective-C
写的方法了。
写这篇的根源,实际上是在翻(gen)看(ben)Swift
(jiu)的(bu)官(zhi)方(dao)文(de)档(shuo)。因而看到可变参数这玩意了。后来想一想,Objective-C
的NSArray
、UIAlertView
等,其实也是基于这样去写的。
算是又明白了一些。希望不太迟。
哭瞎了。。。