Swift入門教程19-泛型,swift入門教程19-

來源:互聯網
上載者:User

Swift入門教程19-泛型,swift入門教程19-

原創Blog,轉載請註明出處

blog.csdn.net/hello_hwc

一 泛型的定義

  和C++的類似,泛型定義了一種適用於任何類型的,可重用的代碼,用一種抽象的方式來實現代碼。Swift的Array和Dictionary都是用泛型來實現的,因為Array可以儲存String類型的變數,也可以儲存Int類型的。

舉個例子

func swapTwoInts(inout a: Int, inout b: Int) {    let temporaryA = a    a=b    b = temporaryA}func swapTwoStrings(inout a: String, inout b: String) {        let temporaryA = a        a=b        b = temporaryA}func swapTwoDoubles(inout a: Double, inout b: Double) {        let temporaryA = a        a=b        b = temporaryA}
這是同樣的函數結構用來交換兩種類型,但是不用泛型的話,我們不得不為每一種類型都定義出對應的函數。十分繁瑣。

使用泛型之後,我們只需要這樣去定義

func swapTwoValues<T>(inout a: T, inout b: T) { let temporaryA = a    a=b    b = temporaryA}

這裡的T是佔為類型,就是告訴編譯器,這是個通用的類型,在實際運算的時候,會有具體的類型進行替換。佔為類型可以作為參數,也可以作為返回值。當然也可以定義多個,例如<T1,T2>

注意:Swift是型別安全的語言,編譯器會進行類型檢查,如果類型不符會報錯。


二 類型約束

  在泛型定義中,類型約束十分重要。比如,定義一個泛型對一組資料進行排序,那麼這組資料一定要能夠比較(大於,等於,小於),如若不然,傳入一組資料中既有Int,又有String,Int和String進行排序,明顯沒有一個合理的規則。

   泛型的約束表示這種類型必須繼承某個類,或者實現某些協議。

   文法如下

func someFunction<T: SomeClass, U: SomeProtocol>(someT: T, someU: U) { // function body goes here}

然後,實現一個使用類型約束來定義泛型的例子。

func findIndex<T: Equatable>(array: T[], valueToFind: T) -> Int? {    for (index, value) in enumerate(array) {            if value == valueToFind {                return index            }    }    return nil}
這裡,通過泛型來定義一個在數組中尋找指定資料的函數,明顯這個類型T要支援==運算子。Equatable就是系統提供的一種協議,遵循這種協議的類型都可以使用==運算子。

三 關聯類別型

在二中,我們使用了系統提供的Equatable,那麼如何自訂類似的協議呢?

使用關聯類別型,文法是在協議中使用typealise關鍵字來定義關聯類別型。

舉例

protocol Container {typealias ItemTypemutating func append(item: ItemType) var count: Int { get }subscript(i: Int) -> ItemType { get }}
這裡,定義一種關聯類別型,ItemType,對於協議來說,任何遵循這個協議的結構體必須實現兩個方法(append,count)一個下標指令碼。而ItemType的具體類型由遵循協議的類來決定。例如

struct IntStack: Container {// IntStack

四 Where語句

Where語句對關聯類別型進行了更進一步的約束。一個where語句可以讓一個關聯類別型遵循某個特定的協議,也可以讓特定的資料類型和關聯類別型的資料類型一致。

func allItemsMatch<        C1: Container, C2: Container        where C1.ItemType == C2.ItemType, C1.ItemType: Equatable> (someContainer: C1, anotherContainer: C2) -> Bool {        if someContainer.count != anotherContainer.count {            return false        }        for i in 0..<someContainer.count {            if someContainer[i] != anotherContainer[i] {                return false            }        }        return true}

這裡定義了四個約束

1.C1必須遵循Container協議

2.C2必須遵循Container協議

3.C1和C2的ItemType一致

4.C1的ItemType遵循Equatable協議




聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.