Swift 5.1 (6) - 函數(shù)

Functions:函數(shù)

函數(shù)是執(zhí)行特定任務(wù)的獨(dú)立代碼塊卿城。為函數(shù)指定了一個(gè)標(biāo)識(shí)其功能的名稱部服,此名稱可用于“調(diào)用”函數(shù)以在需要時(shí)執(zhí)行其任務(wù)。Swift中的每個(gè)函數(shù)都有一個(gè)類型鹅髓,由函數(shù)的參數(shù)類型和返回類型組成舞竿。可以像Swift中的任何其他類型一樣使用此類型窿冯,這使得將函數(shù)作為參數(shù)傳遞給其他函數(shù)以及從函數(shù)返回函數(shù)變得很容易骗奖。函數(shù)也可以在其他函數(shù)中嵌套使用。

定義和調(diào)用函數(shù)

定義函數(shù):定義函數(shù)的名稱+定義函數(shù)的參數(shù)+定義函數(shù)的返回值。
調(diào)用函數(shù):使用其名稱調(diào)用該函數(shù)重归,傳遞與函數(shù)參數(shù)類型匹配的值米愿。

func greet(person: String) -> String {
    let greeting = "Hello, " + person + "!"
    return greeting
}
//上述方法也可以寫為
func greetAgain(person: String) -> String {
    return "Hello again, " + person + "!"
}
print(greetAgain(person: "Anna")) //<! "Hello again, Anna!"

函數(shù)參數(shù)和返回值

無參函數(shù)
函數(shù)不要求必須定義輸入?yún)?shù)。即使函數(shù)無參鼻吮,在函數(shù)名稱后仍需要括號(hào)育苟。調(diào)用函數(shù)時(shí),函數(shù)名后面還會(huì)有一對空括號(hào)椎木。

func sayHelloWorld() -> String {
    return "hello, world"
}
print(sayHelloWorld())//<!  "hello, world"

有多個(gè)參數(shù)的函數(shù)

func greet(person: String, alreadyGreeted: Bool) -> String {
    if alreadyGreeted {
        return greetAgain(person: person)
    } else {
        return greet(person: person)
    }
}
print(greet(person: "Tim", alreadyGreeted: true))//<! "Hello again, Tim!"

沒有返回值的函數(shù)
函數(shù)不要求必須定義返回值類型违柏。

func greet(person: String) {
    print("Hello, \(person)!")
}
greet(person: "Dave") //<! "Hello, Dave!"

沒有定義返回類型的函數(shù)返回Void類型的特殊值。是一個(gè)空元組()香椎。
有多個(gè)返回值的函數(shù)
使用元組類型作為函數(shù)的返回值類型漱竖,同時(shí)返回多個(gè)函數(shù)值。

//定義
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)
}
//調(diào)用
let bounds = minMax(array: [8, -6, 2, 109, 3, 71])
print("min is \(bounds.min) and max is \(bounds.max)")//<! min is -6 and max is 109

返回值為可選的元組類型
若函數(shù)返回的元組類型可能為空值時(shí)畜伐,則可以使用可選的元組返回類型馍惹。通過在元組類型的右括號(hào)后面放置一個(gè)?來編寫一個(gè)可選的元組返回類型,例如(Int玛界,Int)万矾?(String,Int慎框,Bool)良狈?

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)
}

使用可選綁定來檢查minMax(array :)函數(shù)是否返回nil

if let bounds = minMax(array: [8, -6, 2, 109, 3, 71]) {
    print("min is \(bounds.min) and max is \(bounds.max)")
}

函數(shù)的參數(shù)標(biāo)簽和參數(shù)名稱

每個(gè)函數(shù)的參數(shù)都有參數(shù)標(biāo)簽和參數(shù)名稱。調(diào)用函數(shù)時(shí)使用參數(shù)標(biāo)簽笨枯。參數(shù)名稱用于函數(shù)的實(shí)現(xiàn)薪丁。默認(rèn)情況下,函數(shù)的參數(shù)名稱便是其參數(shù)標(biāo)簽
指定參數(shù)標(biāo)簽
在參數(shù)名稱前面編寫參數(shù)標(biāo)簽馅精,用空格分隔:

func someFunction(argumentLabel parameterName: Int) {
}
//調(diào)用
someFunction(argumentLabel: 6) // 參數(shù)名稱 parameterName : 6
//方式二严嗜,默認(rèn)情況
func someFunction(parameterName: Int) {
}
someFunction(parameterName: 6)// 參數(shù)名稱 parameterName : 6

省略參數(shù)標(biāo)簽
如果不想要參數(shù)的參數(shù)標(biāo)簽,請用下劃線_替換明確的參數(shù)標(biāo)簽硫嘶。

func someFunction(_ parameterName: Int) { 
}
//調(diào)用
someFunction(7)//參數(shù)忽略阻问,parameterName:7

默認(rèn)參數(shù)值
通過在該參數(shù)的類型之后為參數(shù)賦值來為函數(shù)中的任何參數(shù)定義默認(rèn)值。如果定義了默認(rèn)值沦疾,則可以在調(diào)用函數(shù)時(shí)省略該參數(shù)称近。

func parameterContainDefaultValue(defaulValue1:Int,defaultValue2:Int=12) {
}
//調(diào)用,兩者皆可以哮塞,
parameterContainDefaultValue(defaulValue1: 12, defaultValue2: 23)
//因?yàn)槟硞€(gè)參數(shù)值定義了默認(rèn)值刨秆,因而多出下面的方法。
parameterContainDefaultValue(defaulValue1: 12)

變量參數(shù)
函數(shù)中使用可變參數(shù)忆畅,表示在函數(shù)調(diào)用時(shí)可以向該參數(shù)傳遞特定類型的不同數(shù)量的參數(shù)值衡未。可變參數(shù)接受零或多個(gè)指定類型的值。
可變參數(shù)的表示:通過在參數(shù)的類型名稱后插入...來表示可變參數(shù)缓醋。
傳遞給可變參數(shù)的值在函數(shù)體內(nèi)可用作適當(dāng)類型的數(shù)組如失。例如,一個(gè)Double ...類型的可變參數(shù)在函數(shù)體內(nèi)可用作[Double]的常量數(shù)組送粱。一個(gè)函數(shù)可能會(huì)有多個(gè)可變參數(shù)褪贵。

func arithmeticMean(_ numbers: Double...) -> Double {
    var total: Double = 0
    for number in numbers {//!< numbers 作為[Double]類型的數(shù)組存在
        total += number
    }
    return total / Double(numbers.count)
}
//調(diào)用
let average = arithmeticMean(1,2,3,4)
print("平均數(shù)\(average)")//!< 平均數(shù)2.5

輸入輸出參數(shù)inout
默認(rèn)情況下,函數(shù)參數(shù)是常量抗俄。如果嘗試從該函數(shù)體內(nèi)修改函數(shù)參數(shù)的值會(huì)導(dǎo)致編譯時(shí)錯(cuò)誤脆丁。
如果我們需要在函數(shù)體內(nèi)修改參數(shù)的值,并且在函數(shù)調(diào)用結(jié)束后需要使用被修改過的參數(shù)的值动雹。那么我們就需要定義該參數(shù)為輸入輸出參數(shù)槽卫。類似C與Object-C中的指針參數(shù)。
輸入輸出參數(shù)表示:通過將inout關(guān)鍵字放在參數(shù)類型之前來表示輸入輸出參數(shù)胰蝠。
注意:只能將變量作為輸入輸出參數(shù)的參數(shù)值進(jìn)行傳遞歼培,不能傳遞常量或文字值作為參數(shù),因?yàn)椴荒苄薷某A亢臀淖?/code>茸塞。當(dāng)我們將變量名稱作為參數(shù)傳遞給輸入輸出參數(shù)時(shí)丐怯,可以在變量名稱前面直接放置符號(hào),以表示它可以由函數(shù)修改翔横。

//根據(jù)內(nèi)存地址交換兩個(gè)整型數(shù)值
func changeTwoIntNumbers(_ a:inout Int,_ b:inout Int) {
    let temp = a
    a = b
    b = temp
}
//使用時(shí)需注意不能將類型為'Int'的不可變值作為inout參數(shù)傳遞,否則會(huì)報(bào)錯(cuò)
var a = 6
var b = 7
changeTwoIntNumbers(&a, &b)
print("b:\(b),a:\(a)")//!< b:6,a:7

函數(shù)類型

每個(gè)函數(shù)都有一個(gè)特定的函數(shù)類型梗搅,由函數(shù)的參數(shù)類型和返回類型組成禾唁。函數(shù)類型不能帶有參數(shù)標(biāo)簽。

func addTwoInts(_ a: Int, _ b: Int) -> Int {
    return a + b
}
func printHelloWorld() {
    print("hello, world")
}

上述示例中的函數(shù)類型分別為:(Int, Int) -> Int() -> Void无切。
使用函數(shù)類型
我們可以像使用Swift中的任何其他類型一樣使用函數(shù)類型荡短。可以將常量或變量定義為函數(shù)類型哆键,并為該變量分配適當(dāng)?shù)暮瘮?shù)掘托。

var mathFunction:(Int,Int)->Int = addTwoInts
let addValue = mathFunction(a,b)
mathFunction = subTwoInts(_:_:)
let subValue = mathFunction(a,b)
print(subValue)//!< 1
print(addValue)//!< 13
//定義的函數(shù)
func addTwoInts(_ a: Int, _ b: Int) -> Int {
    return a + b
}
func subTwoInts(_ a:Int,_  b:Int)-> Int {
    return a - b
}

函數(shù)類型作為參數(shù)類型
使用函數(shù)類型如(Int,Int)- > Int作為另一個(gè)函數(shù)的參數(shù)類型籍嘹。

//定義
func mathResultFunction(_ mathCalculate:(Int,Int)->Int,_ a:Int, _ b:Int){
    print("函數(shù)計(jì)算的結(jié)果為:\(mathCalculate(a,b))")
}
//調(diào)用
var mathFunction:(Int,Int)->Int = addTwoInts
let addValue = mathFunction(a,b)
mathFunction = subTwoInts(_:_:)
let subValue = mathFunction(a,b)
mathResultFunction(mathFunction, a, b)//!< 函數(shù)計(jì)算的結(jié)果為:1
mathResultFunction(addTwoInts(a:_:), a, b)//!< 函數(shù)計(jì)算的結(jié)果為:13

函數(shù)類型作為返回類型
使用函數(shù)類型作為另一個(gè)函數(shù)的返回類型闪盔。

//以下兩個(gè)函數(shù)盡管具有不同的功能,但是都具有相同的函數(shù)類型辱士,
func stepForward(_ input: Int) -> Int {
    return input + 1
}
func stepBackward(_ input: Int) -> Int {
    return input - 1
}
//定義返回值類型為函數(shù)類型的函數(shù)
func chooseStepFunction(backward: Bool) -> (Int) -> Int {
    return backward ? stepBackward : stepForward
}
//簡單使用一下
var currentValue = 3
//! tempChooseStepFunction:stepBackward
let tempChooseStepFunction = chooseStepFunction(backward: currentValue > 0)
while currentValue > 0 {
    currentValue = tempChooseStepFunction(currentValue)
    print(currentValue)
}//!< 2 1 0

嵌套函數(shù)

func chooseStepFunction(backward: Bool) -> (Int) -> Int {
    func stepBackward(_ input: Int) -> Int {
        return input - 1
    }
    func stepForward(input: Int) -> Int {
        return input + 1
    }
    return backward ? stepBackward : stepForward
}

參考資料:
swift 5.1官方編程指南

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末泪掀,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子颂碘,更是在濱河造成了極大的恐慌异赫,老刑警劉巖,帶你破解...
    沈念sama閱讀 207,113評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異塔拳,居然都是意外死亡鼠证,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,644評論 2 381
  • 文/潘曉璐 我一進(jìn)店門靠抑,熙熙樓的掌柜王于貴愁眉苦臉地迎上來量九,“玉大人,你說我怎么就攤上這事孕荠∶漯模” “怎么了?”我有些...
    開封第一講書人閱讀 153,340評論 0 344
  • 文/不壞的土叔 我叫張陵稚伍,是天一觀的道長弯予。 經(jīng)常有香客問我,道長个曙,這世上最難降的妖魔是什么锈嫩? 我笑而不...
    開封第一講書人閱讀 55,449評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮垦搬,結(jié)果婚禮上呼寸,老公的妹妹穿的比我還像新娘。我一直安慰自己猴贰,他們只是感情好对雪,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,445評論 5 374
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著米绕,像睡著了一般瑟捣。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上栅干,一...
    開封第一講書人閱讀 49,166評論 1 284
  • 那天迈套,我揣著相機(jī)與錄音,去河邊找鬼碱鳞。 笑死桑李,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的窿给。 我是一名探鬼主播贵白,決...
    沈念sama閱讀 38,442評論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼填大!你這毒婦竟也來了戒洼?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,105評論 0 261
  • 序言:老撾萬榮一對情侶失蹤允华,失蹤者是張志新(化名)和其女友劉穎圈浇,沒想到半個(gè)月后寥掐,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,601評論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡磷蜀,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,066評論 2 325
  • 正文 我和宋清朗相戀三年召耘,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片褐隆。...
    茶點(diǎn)故事閱讀 38,161評論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡污它,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出庶弃,到底是詐尸還是另有隱情衫贬,我是刑警寧澤,帶...
    沈念sama閱讀 33,792評論 4 323
  • 正文 年R本政府宣布歇攻,位于F島的核電站固惯,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏缴守。R本人自食惡果不足惜葬毫,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,351評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望屡穗。 院中可真熱鬧贴捡,春花似錦、人聲如沸村砂。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,352評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽础废。三九已至源祈,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間色迂,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,584評論 1 261
  • 我被黑心中介騙來泰國打工手销, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留歇僧,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 45,618評論 2 355
  • 正文 我出身青樓锋拖,卻偏偏與公主長得像诈悍,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子兽埃,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,916評論 2 344

推薦閱讀更多精彩內(nèi)容