swift 筆記 二十 泛型

2021-06-22 13:02:59 字數 1562 閱讀 5052

泛型

泛型是為了解決在針對不同資料型別,而做了同一種功能的操作導致的每個型別我們都要寫乙份**的問題。 有了泛型,我們可以只寫乙份邏輯**,而適應於不同的資料型別。

func swapint(inout num1:

int, inout num2: 

int)

func swapdouble(inout num1: 

double, inout num2:

double)

上面兩個函式的功能,完全一樣,僅僅是資料型別的不同。

所以這種問題,我們可以用泛型來解決:

func swap

(inout num1:

t, inout num2: 

t)  

現在只要使用swap這個函式,兩個引數的型別相同,就可以交換兩個變數的值了。

早些時候,我們已經見過:

var myarray:

array = [1,2,3,4]

這樣的寫法了,array就是個泛型的struct版本,而<>中指定的是我們需要往array中存放的是什麼資料型別。這就是泛型的一種特化方式。

型別約束

有時候,我們需要為泛型的引數做個過濾,有一些引數不准傳入,有一些可以。我們就可以通過型別約束來達到這個目的。

: 約func

isthesamevalue: equatable>(value1: 

t, value2: 

t) -> 

bool

所有的支援 == 操作符的型別,都可以當做引數傳入。

關聯型別

官方的例子:

協議的實現:

因為swift是會自動推導型別的,所以,這裡的typealias itemtype = int其實是可以省略的。

如果我們需要讓乙個已經存在的類也符合這個關聯型別,而,這個類,又恰好已經遵循了這個協議,我們就可以留個空擴充套件,讓它滿足我們的需求:

extension array: containner 

{}這樣就可以將任何array當作是containner來使用了。

where 語句

官方的例子:

where語句寫在泛型的型別引數列表中,以約束兩個以上的型別,據有某些共同特質,才可以傳入allitemsmatch這個函式。

這個where語句描述的要求是:

c1 c2 是兩個引數的型別,他們都遵循container約束,c1的itemtype與c2的itemtype必須相同,並且c1的itemtype是遵循equatable協議的(既然c2的itemtype與c1的itemtype必須相同,所以這裡不必再單獨寫個c2的itemtype也符合equatable)。

函式體就不解釋了,肯定看得懂。

swift 筆記 二十 泛型

泛型 泛型是為了解決在針對不同資料型別。而做了同一種功能的操作導致的每乙個型別我們都要寫乙份 的問題。有了泛型,我們能夠僅僅寫乙份邏輯 而適應於不同的資料型別。func swapint inout num1 int,inout num2 int func swapdouble inout num1 ...

Swift學習筆記系列 (23)泛型

tags swift 學習筆記 感慨一下 泛型這一章很亂,很零碎,很難總結。避免重複 增加靈活性 所有型別 泛型是另外一種引數,引數表示的是型別,泛型小可以用在函式上,大可用在型別定義上。這裡 型別 不包括協議,協議定義不能直接採用泛型,可以採用關聯型別。函式引數的型別也是引數的函式叫做泛型函式。這...

Swift之泛型型別與泛型引數

import foundation func swaptwoints inout a int,inout b int func swaptwostrings inout a string,inout b string func swaptwodoubles inout a double,inout ...