泛型(generic)能夠使咱們在程序中定義一些可變部分,在運行的時候指定,使用泛型能夠最大程度重用代碼,保護類型的安全以及提升性能。安全
一、泛型函數ide
在函數名後面加<T>,參數類型也被聲明爲T,T成爲佔位符,函數在每次調用時傳入實際的參數類型才決定T的類型
函數
func log4<T>(msg : T) {性能
println(msg)
it
}
編譯
log4(3)
class
log4("sorry")
泛型
log4(1.02)
程序
若是有多個不一樣類型,能夠使用其它大寫字母,通常習慣使用U,多個佔位符使用逗號,隔開:
協議
示例以下:
func isEquals<T,U>(a :T,b : U) ->Bool {
}
佔位符不只能夠替代參數類型,還能夠替代返回值類型:
func isEquals<T,U>(a: T,b:U) -> T{}
二、泛型約束
有些佔位符必須遵照某種協議,及T佔位符後面添加冒號和協議類型,這種表示方式成爲泛型約束,它可以替換T的類型。
例如一個比較函數:
func isEquals<T>(a : T, b : T) ->Bool {
return(a==b)
}
上面的函數在編譯時會出錯,這是由於並非全部類型都具備可比性,T表示的類型必須遵照Comparable協議實現的類型,comparable協議表示可比較的:
修改以下:
func isEquals<T:Comparable>(a : T, b : T) -> Bool {
return (a==b)
}