Swift 個人學習筆記 – 07: 函式

NO IMAGE
1 Star2 Stars3 Stars4 Stars5 Stars 給文章打分!
Loading...

本文章純粹是中文版《The Swift Programming Language》的學習筆記,所以絕大部分的內容都是文中有的。本文是本人的學習筆記,不是正式系統的記錄。僅供參考

以下還是有很多沒看懂、不確定的地方,我會以“存疑”的註解指出。

在此感謝中文版翻譯者,這極大地加快了 Swift 的學習速度。

本文地址:https://segmentfault.com/a/1190000008456636


Reference:

原版:The Swift Programming Language
中文版:Swift 3 程式語言 – 函式

函式的基本知識在序言已經講了,這裡不重複。只是提一下少數進階的功能。

可選返回型別

如果一個函式的返回值的任一部分有可能是 nil,那麼需要加上問號。比如:

    func someFunc (array: [Int]) -> (min: Int, max: Int)? {
...
}

注意 (Int, Int)?(Int?, Int?) 的含義是不同的。

形參和實參

在 C 裡面,一個函式在宣告的時候,可以只宣告函式引數的型別,而不宣告其名字。另外,也可以在宣告的時候為引數指定名字,使得語義更加明確。而在函式實際使用(定義)的時候,你可以重新命名相應的引數名,便於實際的函式實現。在 Swift 中也支援這樣的寫法。

Swift 的宣告和定義實際上是在一塊兒的,所以你需要在定義的時候同時指定形式引數和實際引數。每一個引數按照 “形式引數 實際引數: 型別” 的格式來寫。如果形式引數是空的,那麼就用 “_” 表示。這樣便於 IDE 識別。

比如有以下幾個寫法:

    // 完全沒有形式引數,非常的 C-style
func isLeftGreaterThanRight(_ left: Int, _ right: Int) -> Bool {...}
// 這個例子我覺得可以說明形參和實參的區別所在,是不是很像 Objective-C 的方法名?
func isNumber(_ left: Int, greaterThan right: Int) -> Bool {...}
// 或者全部定義完全,個人覺得這個定義比較瘋狂……
func check(number left: Int, isGreaterThan right: Int) -> Bool {...}

可變引數

Swift 中的可變引數和 C 不一樣。C 的可變引數經常用於實現字串填充功能(其實理論上是可以做更多)。
但是 Swift 裡的可變引數實際上只是一個語法糖而已,其作用是將多個同型別的引數幫你拼接成 Array 型別作為引數。使用 “...” 表示可變引數。比如:

    func sum (numbers: Double) -> Double {
var ret = 0.0
for eachNum in numbers {
ret  = eachNum
}
return ret
}

“輸入輸出” 形式引數

這裡類似於 C 裡面講到指標時的地址引用,使用的也是相同的例子:

    func swap (_ a: inout Int, _ b: inout Int) {
let temp = a
a = b
b = temp
}

注意上面的 inout 關鍵字。呼叫的方法是:swap(&numA, &numB),是不是很像 C 裡的取地址?

變數型別:“函式”

就像 C 一樣,函式也可以成為一個變數型別。Swift 因為沒有函式指標的概念,所以函式型別的定義實際上變得很明確。
比如函式 func someFunc(_ a: Int, _ b: Int) -> Int{...} 的型別就是 (Int, Int) -> Int。這就是一個資料型別了,稱為 “函式型別”,可以用來定義變數!比如:

    var someFuncVal : (Int, Int) -> Int = someFunc

呼叫的方式是:someFuncVal(1, 2),比 C 裡還要糾結 “*” 號好多了!
函式型別的變數也可能用來作為函式變數或者是函式返回值,這個時候就會出現很多個 “->”。這裡就不展開了,我隱約嗅到了混亂 Swift 的味道……

函式內嵌

函式的內部可以再定義一個函式,有點像 Objective-C 裡面的 “程式碼塊” 的作用。這裡也很好理解,不展開

相關文章

IOS開發 最新文章