本文章純粹是中文版《The Swift Programming Language》的學習筆記,因此絕大部分的內容都是文中有的。本文是本人的學習筆記,不是正式系統的記錄。僅供參考html
如下仍是有不少沒看懂、不肯定的地方,我會以「存疑」的註解指出。編程
在此感謝中文版翻譯者,這極大地加快了 Swift 的學習速度。swift
本文地址:http://www.javashuo.com/article/p-ugbvcxff-hp.htmlsegmentfault
原版:The Swift Programming Language
中文版:Swift 3 編程語言 - 函數app
函數的基本知識在序言已經講了,這裏不重複。只是提一下少數進階的功能。編程語言
若是一個函數的返回值的任一部分有多是 nil
,那麼須要加上問號。好比:函數
func someFunc (array: [Int]) -> (min: Int, max: Int)? { ... }
注意 (Int, Int)?
和 (Int?, Int?)
的含義是不一樣的。學習
在 C 裏面,一個函數在聲明的時候,能夠只聲明函數參數的類型,而不聲明其名字。另外,也能夠在聲明的時候爲參數指定名字,使得語義更加明確。而在函數實際使用(定義)的時候,你能夠從新命名相應的參數名,便於實際的函數實現。在 Swift
中也支持這樣的寫法。ui
Swift
的聲明和定義其實是在一起的,因此你須要在定義的時候同時指定形式參數和實際參數。每個參數按照 「形式參數 實際參數: 類型
」 的格式來寫。若是形式參數是空的,那麼就用 「_
」 表示。這樣便於 IDE 識別。spa
好比有如下幾個寫法:
// 徹底沒有形式參數,很是的 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 裏面的 「代碼塊」 的做用。這裏也很好理解,不展開