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