Swift: 可变参数
轉自: https://addicechan.github.io/...
在Swift中,命名一個方法參數的時候,如果有多個特定類型的參數,可以直接使用可變參數(Variadic Parameters)。官網文檔鏈接
使用可變參數,其實很簡單。就是在參數類型加上…。比如Int…。實際上,方法內部去調用該參數的話,Xcode提示的是[Int]。也就是一個Array。這樣也是大大方便。不用非得去聲明一個[Int]。
小二。。上代碼~~~
// 多數字相加 func add(_ values: Int...) -> Int {return values.reduce(0){ $0 + $1 } }print(add(1,5,8,9)) // 23再比如,可以封裝一個UIAlertController。如果覺得每次得寫一大堆alert.addAction() 巴拉巴拉.
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: { _ incompletionHandler(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 inprint(index) }不過,可變參數無法用于Objective-C中。
Objective-C如果要使用可變參數。那么需要使用到va_list等系列C函數。
小二,繼續上代碼~~~
- (NSString *)add:(NSString *)value, ... NS_REQUIRES_NIL_TERMINATION {NSMutableString *result = [NSMutableString string];[result appendString:value];if (value) {va_list values;// values 會從 value 的指針地址開始取值,直至nilva_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封裝的太好了。很方便的...語法,加上高階函數的使用。貌似也不太算很公正的對比。(逃。
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等,其實也是基于這樣去寫的。
算是又明白了一些。但愿不太遲。
哭瞎了。。。
總結
以上是生活随笔為你收集整理的Swift: 可变参数的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【打CF,学算法——二星级】Codefo
- 下一篇: 使用母版页时内容页如何使用css和jav