swift 函数.和匿名函数
函數
注意: 沒有定義返回類型的函數會返回特殊的值,叫 Void。它其實是一個空的元組(tuple),沒有任何元素,可以寫成()。
使用元組作為返回參數,返回多個參數
外部參數名
外部參數名..是為了調用該函數時讓其參數更為有表現力,更為通順,同時還保持了函數體是可讀的和有明確意圖的。讓別人閱讀整段代碼時更方便
當其他人在第一次讀你的代碼,函數參數的意圖顯得不明顯時,考慮使用外部參數名。如果函數參數名的意圖是很明顯的,那就不需要定義外部參數名了
如果你需要提供外部參數名,但是局部參數名已經定義好了,那么你不需要寫兩次參數名。相反,只寫一次參數名,并用井號(#)作為前綴就可以了。這告訴 Swift 使用這個參數名作為局部和外部參數名。
func containsCharacter(#string: String, #characterToFind: Character) -> Bool {for character in string {if character == characterToFind {return true}}return false }默認值
將帶有默認值的參數放在函數參數列表的最后。這樣可以保證在函數調用時,非默認參數的順序是一致的,同時使得相同的函數在不同情況下調用時顯得更為清晰。
當你未給帶默認值的參數提供外部參數名時,Swift 會自動提供外部名字。此時外部參數名與局部名字是一樣的,就像你已經在局部參數名前寫了井號(#)一樣。
可變參數
一個可變參數(variadic parameter)可以接受一個或多個值.傳入可變參數的值在函數體內當做這個類型的一個數組。
- 一個函數至多能有一個可變參數,而且它必須是參數表中最后的一個。這樣做是為了避免函數調用時出現歧義。
- 如果函數有一個或多個帶默認值的參數,而且還有一個可變參數,那么把可變參數放在參數表的最后。
常量參數和變量參數
函數參數默認是常量。試圖在函數體中更改參數值將會導致編譯錯誤。這意味著你不能錯誤地更改參數值
注意: 對變量參數所進行的修改在函數調用結束后便消失了,并且對于函數體外是不可見的。變量參數僅僅存在于函數調用的生命周期中。
In-Out參數
- 定義一個輸入輸出參數時,在參數定義前加 inout 關鍵字
- 輸入輸出參數不能有默認值,而且可變參數不能用 inout 標記。如果你用 inout 標記一個參數,這個參數不能被 var 或者 let 標記。
- 當傳入的參數作為輸入輸出參數時,需要在參數前加&符,表示這個值可以被函數修改
函數類型
函數類型,可以讓一個變量可以成為多個函數,同時可以把函數當參數進行傳遞或者當做返回值
var mathFunction: (Int, Int) -> Int = addTwoIntsfunc printMathResult(mathFunction: (Int, Int) -> Int, a: Int, b: Int) {println("Result: \(mathFunction(a, b))") }func chooseStepFunction(backwards: Bool) -> (Int) -> Int {func stepForward(input: Int) -> Int { return input + 1 }func stepBackward(input: Int) -> Int { return input - 1 }return backwards ? stepBackward : stepForward }閉包
閉包可以捕獲和存儲其所在上下文中任意常量和變量的引用。 這就是所謂的閉合并包裹著這些常量和變量,俗稱閉包。Swift 會為您管理在捕獲過程中涉及到的所有內存操作。 閉包采取如下三種形式之一:閉包表達式:
{ (parameters) -> returnType instatements}閉包特性一:利用上下文推斷參數和返回值類型
閉包作為函數參數的話,由于類型推斷...可以省去閉包參數的類型和返回值閉
reversed = sorted(names, { (s1: String, s2: String) -> Bool in return s1 > s2 } )reversed = sorted(names, { s1, s2 in return s1 > s2 } )閉包特性二:隱式返回單表達式閉包,即單表達式閉包可以省略return關鍵字
包函數體內如果是單一表達式,還可以省去return語句
reversed = sorted(names, { s1, s2 in s1 > s2 } )閉包特性三:參數名稱縮寫
- 1 當使用參數名稱縮寫的時候可以省去in
- 2 運算符函數(Operator Functions)起作用還可以簡寫
閉包特性四:尾隨(Trailing)閉包語法
如果您需要將一個很長的閉包表達式作為最后一個參數傳遞給函數,可以使用尾隨閉包來增強函數的可讀性。 尾隨閉包是一個書寫在函數括號之后的閉包表達式,函數支持將其作為最后一個參數調用。
let digitNames = [0: "Zero", 1: "One", 2: "Two", 3: "Three", 4: "Four",5: "Five", 6: "Six", 7: "Seven", 8: "Eight", 9: "Nine" ] let numbers = [16, 58, 510] let strings = numbers.map {(var number) -> String invar output = ""while number > 0 {output = digitNames[number % 10]! + outputnumber /= 10}return output }捕獲值
閉包可以在其定義的上下文中捕獲常量或變量。
即使定義這些常量和變量的原域已經不存在,閉包仍然可以在閉包函數體內引用和修改這些值。
閉包是引用類型。但是注意,當一個嵌套函數內的函數作為返回值的時候實際上是創建了一個新的函數.
//全局函數 var str = "Hello, playground" func test(a:String=""){println(str) } test(); //"Hello, playground" str = "Hello"; test(); //"Hello"//嵌套函數 func makeIncrementor(forIncrement amount: Int) -> () -> Int {var runningTotal = 0func incrementor() -> Int {runningTotal += amount //runningTotalreturn runningTotal}return incrementor }let incrementByTen = makeIncrementor(forIncrement: 10) incrementByTen() // 返回的值為10 incrementByTen() // 返回的值為20 incrementByTen() // 返回的值為30//由于是創建了一個新函數..所以會像下面顯示 let incrementBySeven = makeIncrementor(forIncrement: 7) incrementBySeven() // 返回的值為7 incrementByTen() // 返回的值為40//由于是引用類型.所以 let alsoIncrementByTen = incrementByTen alsoIncrementByTen() // 返回的值為50注意: Swift 會決定捕獲引用還是拷貝值。 您不需要標注amount或者runningTotal來聲明在嵌入的incrementor函數中的使用方式。 Swift 同時也處理runingTotal變量的內存管理操作,如果不再被incrementor函數使用,則會被清除。
總結
以上是生活随笔為你收集整理的swift 函数.和匿名函数的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: VS2010安装HTML5插件
- 下一篇: mongodb用户管理简单记录