iT邦幫忙

2022 iThome 鐵人賽

DAY 28
0

今天來介紹一個比較進階的語法,你可能前期用不到它,但當你越來越厲害之後你就會發現它。

進入正題

今天會學到

  • 泛型解決的問題
  • 通用函數
  • 類型參數
  • 命名類型參數

Generics

泛型使你能夠編寫靈活的、可重用的函數和類型,這些函數和類型可以與任何類型一起使用。泛型是 Swift 最強大的特性之一,而且 Swift標準庫的大部分都是用泛型代碼構建的。用了他可以避免寫許多重複的程式碼。

泛型解決的問題

我們先簡單看以下這個例子。

func swapTwoInts(_ a: inout Int, _ b: inout Int) {
    let temporaryA = a
    a = b
    b = temporaryA
}

簡單來說這個函式在做的是把a跟b這兩個數字交換再輸出參數。
那我們再來看看下面這個例子

func swapTwoStrings(_ a: inout String, _ b: inout String) {
    let temporaryA = a
    a = b
    b = temporaryA
}

是不是跟上面長得幾乎一樣,只是把Int型別換成了String型別。

通用函數

泛型函數可以用於任何類型

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

從上面的程式碼我們看到,剛剛的Int跟String變成了T,那T是什麼呢?佔位符類型名稱,而不是實際類型名稱(Int, Double, String等等)。佔位符類型名稱沒有說明T必須是什麼,但是a和b必須是相同的type T!!!

類型參數

類型參數就是在函數後面用<>括起來的T,func swapTwoValues<T>。一旦指定了類型參數,就可以使用它來定義函數參數的類型。在swapTwoValues(::)下面的例子中,第一次調用函數時被替換,T第二次調用時被替換。

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

var someInt = 3
var anotherInt = 107
swapTwoValues(&someInt, &anotherInt)   //someInt跟anotherInt交換數字

var someString = "hello"
var anotherString = "world"
swapTwoValues(&someString, &anotherString)  //someString跟anotherString交換字串

p.s.大家習慣用T來表示佔位符

命名類型參數

在很多情況下,我們的型別參數會取原本就有意義的名字,像是字典Dictionary<Key, Value>、陣列Array[Element],來讓大家知道泛型類型跟函數之間的關係,但如果沒有的話我們通常會用T。

泛型還有許多進階用法,可以看看我老師的文章


上一篇
Day-27 版本控制 - Git, Github
下一篇
Day-29 快捷鍵大師 - Xcode shortcut&tips
系列文
如何成為IOS初級工程師30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言