目錄
一壹甥、泛型引入——一個打印機案例引發(fā)的思考
二团搞、泛型寫法——提高代碼復用性
三、類型約束
四良姆、關聯類型
打印機案例
func myPrintInt(arg:Int){
print(arg)
}
func myPrintDouble(arg:Double){
print(arg)
}
func myPrintString(arg:String){
print(arg)
}
【思考】如果此時我們打印其他類型的值,就需要針對不同的類型寫類似的方法讥脐,但是這些方法僅僅只是參數類型不同遭居。
解決方案:能不能讓這個類型暫定,等我傳的時候再定攘烛。一個函數解決所有類型魏滚,如何解決?—— 泛型
知識點一 泛型寫法
1坟漱、給參數類型選擇一個代號鼠次,并用<>包裹,放在函數名后面芋齿,如上面例子中的<T>腥寇,用它來指定參數類型, Array<String>
2觅捆、真正調用的時候會被實際的類型替代赦役,如傳遞的是Int,就替換為Int栅炒,如果傳入的是Double類型就替換為Double等等
func myPrint<T>(arg:T){
print(arg)
}
myPrint(arg:1)
myPrint(arg:3.3)
myPrint(arg:"haha")
myPrint(arg:[1,2,3,4])
知識點二 類型約束
類型約束掂摔,即給類型添加約束
上面的函數可以用于任意類型术羔。但是,有時在用于泛型函數需要遵循特定的類型,比如是某個類型或者必須遵循某個協議
類型約束直接在類型參數后面指明約束條件乙漓;
- 案例一:遵循某個類型
func myPrint2<T:UIView>(arg:T){//傳進來的類型必須是UIView類
print(arg)
}
myPrint2(arg:1)
- 案例二:遵循某個協議
protocol ProtocolA{
func work()
}
func myPrint3<T:ProtocolA>(arg:T){//傳進來的類型必須遵循ProtocolA協議
print(arg)
}
myPrint3(arg:1)
知識點三 關聯類型
在協議中怎么使用泛型
- 示范錯誤案例
在協議中级历,某個類型不確定,我需要使用一個類型占位符叭披,按照上面的寫法寥殖,直接寫報錯。
protocol SomeProtocol<T>{
func method1(arg:T)
func method2(arg:T)
}
- 關聯類型正確案例
關聯類型通過 associatedtype 關鍵字指定
protocol SomeProtocol{
associatedtype T
// associatedtype T:UIView 給關聯類型添加約束
func method1(arg:T)
func method2(arg:T)
}
class A:SomeProtocol{
func method1(arg: String) {//只要參數傳進來涩蜘,立馬和T關聯--關聯類型
<#code#>
}
func method2(arg: String) {//第二個方法參數自動變?yōu)镾tring
<#code#>
}
}
- 給關聯類型添加約束