泛型函數(shù)是一種在函數(shù)定義時可以指定使用哪種類型的函數(shù)泪姨,而在函數(shù)調用時再具體指定該類型的函數(shù)。通過泛型函數(shù),我們可以在一個函數(shù)中處理不同類型的數(shù)據(jù)悍缠,從而提高代碼的復用性和可擴展性。
在 Swift
中耐量,使用 <T>
或 <T: SomeProtocol>
語法來定義泛型函數(shù)飞蚓,其中 <T>
表示任意類型,而 <T: SomeProtocol>
表示 T 類型必須符合 SomeProtocol
協(xié)議廊蜒。
基本語法
泛型函數(shù)的基本語法如下:
func functionName<T>(parameter: T) -> T {
// code here
}
在上面的代碼中趴拧,我們使用尖括號(<T>)聲明一個泛型類型參數(shù)T溅漾。在函數(shù)的參數(shù)列表中,我們將parameter
參數(shù)的類型設置為T著榴,并將函數(shù)的返回類型設置為T添履。這表示該函數(shù)可以接受任何類型的參數(shù),并返回該參數(shù)的同一類型兄渺。
示例代碼
下發(fā)實現(xiàn)了一個簡單的 add
函數(shù)缝龄,該函數(shù)可以對所有符合 Numeric
協(xié)議的類型進行加法運算,而對于其他類型則會編譯錯誤挂谍。
func add<T>(_ a: T, _ b: T) -> T where T: Numeric {
return a + b
}
let x = add(1, 2) // x = 3
let y = add(1.0, 2.5) // y = 3.5
let z = add("Hello, ", "world!") // z = "Hello, world!"
let w = add(true, false) // error: cannot convert value of type 'Bool' to expected argument type 'Numeric'
map函數(shù)
map
函數(shù)是一個常見的泛型函數(shù)叔壤,它將一個類型的值轉換為另一個類型的值。在Swift
中口叙,map
函數(shù)通常用于數(shù)組炼绘、集合或序列等數(shù)據(jù)類型。
func map<T, U>(_ array: [T], _ transform: (T) -> U) -> [U] {
var result = [U]()
for item in array {
result.append(transform(item))
}
return result
}
在上面的代碼中妄田,我們聲明了兩個泛型類型參數(shù)T和U俺亮。函數(shù)接受一個數(shù)組array
和一個函數(shù)transform
,該函數(shù)將類型T的值轉換為類型U的值疟呐。函數(shù)遍歷array
中的每個元素脚曾,并使用transform
函數(shù)將其轉換為類型U的值,最后將所有轉換后的值存儲在一個新的數(shù)組中启具,并將其返回本讥。
filter函數(shù)
filter函數(shù)是另一個常見的泛型函數(shù),它用于從一個數(shù)組或集合中篩選出符合特定條件的元素鲁冯。在Swift中拷沸,filter函數(shù)通常用于數(shù)組、集合或序列等數(shù)據(jù)類型薯演。
func filter<T>(_ array: [T], _ isIncluded: (T) -> Bool) -> [T] {
var result = [T]()
for item in array {
if isIncluded(item) {
result.append(item)
}
}
return result
}
在上面的代碼中撞芍,我們聲明了一個泛型類型參數(shù)T。函數(shù)接受一個數(shù)組array
和一個函數(shù)isIncluded
跨扮,該函數(shù)用于確定array
中的每個元素是否應包含在結果數(shù)組中序无。函數(shù)遍歷array
中的每個元素,并使用isIncluded
函數(shù)檢查該元素是否應包含在結果數(shù)組中好港,最后將符合條件的所有元素存儲在一個新的數(shù)組中愉镰,并將其返回。
總結
泛型函數(shù)是Swift
中非常有用的功能钧汹,它使我們能夠編寫通用代碼丈探,可以在多種類型上工作,而不必為每種類型編寫單獨的函數(shù)拔莱。在上面的學習筆記中碗降,我們學習了泛型函數(shù)的基本語法隘竭,并使用示例代碼進行了演示。我希望這篇學習筆記可以幫助您更好地理解Swift
中的泛型函數(shù)讼渊。