轉自: 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: { _ 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
中。
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 的指標地址開始取值,直至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
封裝的太好了。很方便的...
語法,加上高階函式
的使用。貌似也不太算很公正的對比。(逃。
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
等,其實也是基於這樣去寫的。
算是又明白了一些。但願不太遲。
哭瞎了。。。