Swift中的可變參數(shù)函數(shù)介紹
可變參數(shù)函數(shù)指的是可以接受任意多個參數(shù)的函數(shù),我們最熟悉的可能就是 NSString 的 -stringWithFormat:方法了。在 Objective-C 中,我們使用這個方法生成字符串的寫法是這樣的:
NSString *name = @"Tom";
NSDate *date = [NSDate date];
NSString *string = [NSString stringWithFormat:
@"Hello %@. Date: %@", name, date];
這個方法中的參數(shù)是可以任意變化的,參數(shù)的第一項是需要格式化的字符串,后面的參數(shù)都是向第一個參數(shù)中填空。在這里我們不再詳細描述 Objective-C 中可變參數(shù)函數(shù)的寫法 (畢竟這是一本 Swift 的書),但是我相信絕大多數(shù)即使有著幾年 Objective-C 經(jīng)驗的讀者,也很難在不查閱資料的前提下正確寫出一個接受可變參數(shù)的函數(shù)。
但是這一切在Swift中得到了前所未有的簡化?,F(xiàn)在,寫一個可變參數(shù)的函數(shù)只需要在聲明參數(shù)時在類型后面加上 ... 就可以了。比如下面就聲明了一個接受可變參數(shù)的 Int 累加函數(shù):
func sum(input: Int...) -> Int {
//...
}
輸入的 input 在函數(shù)體內(nèi)部將被作為數(shù)組 [Int] 來使用,讓我們來完成上面的方法吧。當然你可以用傳統(tǒng)的 for...in 做累加,但是這里我們選擇了一種看起來更 Swift的方式:
func sum(input: Int...) -> Int {
return input.reduce(0, combine: +)
}
println(sum(1,2,3,4,5))
// 輸出:15
在使用可變參數(shù)時需要注意的是可變參數(shù)只能作為方法中的最后一個參數(shù)來使用,而不能先聲明一個可變參數(shù),然后再聲明其他參數(shù)。這是很容易理解的,因為編譯器將不知道輸入的參數(shù)應(yīng)該從哪里截斷。另外,在一個方法中,最多只能有一組可變參數(shù)。
一個比較惱人的限制是可變參數(shù)都必須是同一種類型的,當我們想要同時傳入多個類型的參數(shù)時就需要做一些變通。比如最開始提到的-stringWithFormat:方法。可變參數(shù)列表的第一個元素是等待格式化的字符串,在 Swift 中這會對應(yīng)一個 String 類型,而剩下的參數(shù)應(yīng)該可以是對應(yīng)格式化標準的任意類型。一種解決方法是使用 Any 作為參數(shù)類型,然后對接收到的數(shù)組的首個元素進行特殊處理。不過因為 Swift 提供了使用下劃線 _ 來作為參數(shù)的外部標簽,來使調(diào)用時不再需要加上參數(shù)名字。我們可以利用這個特性,在聲明方法是就指定第一個參數(shù)為一個字符串,然后跟一個匿名的參數(shù)列表,這樣在寫起來的時候就 "好像" 是所有參數(shù)都是在同一個參數(shù)列表中進行的處理,會好看很多。比如Swift 的 NSString 格式化的聲明就是這樣處理的:
extension NSString {
convenience init(format: NSString, _ args: CVarArgType...)
//...
}
調(diào)用的時候就和在 Objective-C 時幾乎一樣了,非常方便:
let name = "Tom"
let date = NSDate()
let string = NSString(format: "Hello %@. Date: %@", name, date)
相關(guān)文章
如何利用SwiftUI實現(xiàn)可縮放的圖片預(yù)覽器
這篇文章主要給大家介紹了關(guān)于如何利用SwiftUI實現(xiàn)可縮放圖片預(yù)覽器的相關(guān)資料,文中通過示例代碼介紹的非常詳細,對大家學習或者使用SwiftUI具有一定的參考學習價值,需要的朋友可以參考下2021-09-09swift實現(xiàn)自動輪播圖效果(UIScrollView+UIPageControl+Timer)
這篇文章主要為大家詳細介紹了swift實現(xiàn)自動輪播圖效果,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下2017-09-09