Swift(十二)函數(shù)

cb93fae52cfe06865b76627aef54e9f3b908644d147987-KoTrU6_fw658.jpeg

函數(shù)的定義

//sayHello函數(shù)名, personName為參數(shù), -> 表示返回值
func sayHello(personName: String) -> String {
    let greeting = "Hello, " + personName + "! "
    return greeting
}

1.多個參數(shù)

func halfOpenRangeLength(start: Int, end: Int) -> Int {
    return end - start
}
print(halfOpenRangeLength(start: 1, end: 10))

2.無參函數(shù)

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

盡管這個函數(shù)沒有參數(shù)齐邦,但是定義的時候椎侠,函數(shù)名后面還是需要一對圓括號。無參函數(shù)被調用時措拇,在函數(shù)名后面也需要一對圓括號我纪。

3.無返回值函數(shù)

 func sayGoodbye(personName: String) {
    print("Goodbye, \(personName)! ")
}
sayGoodbye("Dave")
// prints "Goodbye, Dave! "

如果函數(shù)沒有返回值,函數(shù)的定義中不需要 箭頭(->)和返回類型丐吓。

多個返回值函數(shù)

func count(string: String) -> (vowels: Int, consonants: Int, others: Int) {
    var vowels = 0, consonants = 0, others = 0
    for character in string.characters {
        switch String(character).lowercased() {
        case "a", "e", "i", "o", "u":
            vowels += 1
        case "b", "c", "d", "f", "g", "h", "j", "k", "l", "m",
             "n", "p", "q", "r", "s", "t", "v", "w", "x", "y", "z":
            consonants += 1
        default:
            others += 1
        }
    }
    return (vowels, consonants, others)
}
let total = count(string: "some arbitrary string! ")
print("\(total.vowels) vowels and \(total.consonants) consonants")

使用元組(tuple)類型組合多個值為一個復合值作為函數(shù)的返回值浅悉。

參數(shù)默認值

func append(string: String = "-") -> String {
    return string + "abc"
}
append() //-abc ,參數(shù)沒有賦值, 則使用默認參數(shù)
append(string: "qq") //qqabc //參數(shù)賦值, 則使用賦值的參數(shù)

可變參數(shù)

func countStr(nums:Double...) ->Double {
    var result = 0.0
    for num in nums {
        result += num
    }
    return result
}
countStr(nums: 1, 2, 3)

注意:一個函數(shù)最多只能由一個可變參數(shù),它必須是參數(shù)列表的最后的一個券犁。這樣做是為了避免函數(shù)調用時出現(xiàn)歧義术健。

常量和變量參數(shù)#

func aliginRight(var string: String) {
  //在swift3.0中, 測試發(fā)現(xiàn)錯誤, 3.0中已經取消了這種寫法, 不能這樣定義變量參數(shù)
//error: parameters may not have the 'var' specifier
//func aliginRight(var string: String) {
                 ^~~

}

輸入輸出參數(shù)

簡單來說, 就是在函數(shù)體內, 通過修改傳入的參數(shù)的值, 達到修改函數(shù)外部變量的效果

//定義一個方法, 用于交換傳入的兩個參數(shù)的值
//使用inout關鍵字
func modify(s1: inout String) {
    s1 = "modify"
}

var string = "string"
modify(s1: &string)
print(string) //"modify"

通過在參數(shù)前加 inout 關鍵字定義一個輸入輸出參數(shù)。輸入輸出參數(shù)值被傳入函數(shù)粘衬,被函數(shù)修改苛坚,然后再被傳出函數(shù)比被,原來的值將被替換。

只能傳入一個變量作為輸入輸出參數(shù)泼舱。不能傳入常量或者字面量(literal value),因為這些值是不允許被修改的枷莉。當傳入的實參作為輸入輸出參數(shù)時娇昙,需要在實參前加 & 符,表示這個值可以被函數(shù)修改笤妙。
從上面這個例子冒掌,可以看到 string原始值在 modify 函數(shù)中已經被修改了,盡管它們定義在函數(shù)體外蹲盘。

注意:輸入輸出參數(shù)和返回值是不一樣的股毫。函數(shù) modify 沒有定義返回值,卻修改了 string值召衔。輸入輸出參數(shù)是函數(shù)對函數(shù)體外產生影響的另一種方式铃诬。

使用函數(shù)類型

func one(a: Int, b: Int) ->Int {
    return a + b
}
//把一個函數(shù)賦值給一個變量
var mathFunction: (Int, Int) -> Int = one
//如果是直接使用函數(shù)名調用, 需要形參
one(a: 1, b: 3)
//如果使用賦值的函數(shù)變量, 則不需要形參
mathFunction(1, 2)

函數(shù)作為參數(shù)

func one(a: Int, b: Int) ->Int {
    return a + b
}
func printMathResult(mathFunction: (Int, Int) -> Int, a: Int, b: Int) {
//調用one函數(shù)
    print("Result: \(mathFunction(a, b) + a + b)")
}
//把函數(shù)傳進來
printMathResult(mathFunction: one, a: 3, b: 5)

函數(shù)作為返回值

func stepForward(input: Int) -> Int {
    return input + 1
}
func stepBackward(input: Int) -> Int {
    return input - 1
}

//該函數(shù)有一個布爾值的參數(shù)backwards和一個返回值, 返回值是一個函數(shù), (該函數(shù)有一個參數(shù)為Int類型,返回值是Int類型)
func chooseStepFunction(backwards: Bool) -> (Int) -> Int {
    return backwards ? stepBackward : stepForward
}

let moveNearerToZero = chooseStepFunction(backwards: false)
// moveNearerToZero 現(xiàn)在代表的就是 stepBackward() 函數(shù)
print(moveNearerToZero(1)) //2

嵌套函數(shù)

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
}

在這章中的所有函數(shù)都是全局函數(shù)(global functions),因為它們定義在全局域中苍凛。
當然函數(shù)也可以被定義在別的函數(shù)體中趣席,稱作嵌套函數(shù)(nested functions)。

默認情況下醇蝴,嵌套函數(shù)是對外是不可見的宣肚,但可以被封閉他們的函數(shù)(enclosing function)調用。封閉函數(shù)可以返回它的一個嵌套函數(shù)悠栓,使這個函數(shù)在其他域中可以被使用霉涨。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市惭适,隨后出現(xiàn)的幾起案子笙瑟,更是在濱河造成了極大的恐慌,老刑警劉巖腥沽,帶你破解...
    沈念sama閱讀 211,042評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件逮走,死亡現(xiàn)場離奇詭異,居然都是意外死亡今阳,警方通過查閱死者的電腦和手機师溅,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,996評論 2 384
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來盾舌,“玉大人墓臭,你說我怎么就攤上這事⊙矗” “怎么了窿锉?”我有些...
    開封第一講書人閱讀 156,674評論 0 345
  • 文/不壞的土叔 我叫張陵酌摇,是天一觀的道長。 經常有香客問我嗡载,道長窑多,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,340評論 1 283
  • 正文 為了忘掉前任洼滚,我火速辦了婚禮埂息,結果婚禮上,老公的妹妹穿的比我還像新娘遥巴。我一直安慰自己千康,他們只是感情好,可當我...
    茶點故事閱讀 65,404評論 5 384
  • 文/花漫 我一把揭開白布铲掐。 她就那樣靜靜地躺著拾弃,像睡著了一般。 火紅的嫁衣襯著肌膚如雪摆霉。 梳的紋絲不亂的頭發(fā)上豪椿,一...
    開封第一講書人閱讀 49,749評論 1 289
  • 那天,我揣著相機與錄音斯入,去河邊找鬼砂碉。 笑死,一個胖子當著我的面吹牛刻两,可吹牛的內容都是我干的增蹭。 我是一名探鬼主播,決...
    沈念sama閱讀 38,902評論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼磅摹,長吁一口氣:“原來是場噩夢啊……” “哼滋迈!你這毒婦竟也來了?” 一聲冷哼從身側響起户誓,我...
    開封第一講書人閱讀 37,662評論 0 266
  • 序言:老撾萬榮一對情侶失蹤饼灿,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后帝美,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體碍彭,經...
    沈念sama閱讀 44,110評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 36,451評論 2 325
  • 正文 我和宋清朗相戀三年悼潭,在試婚紗的時候發(fā)現(xiàn)自己被綠了庇忌。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,577評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡舰褪,死狀恐怖皆疹,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情占拍,我是刑警寧澤略就,帶...
    沈念sama閱讀 34,258評論 4 328
  • 正文 年R本政府宣布捎迫,位于F島的核電站,受9級特大地震影響表牢,放射性物質發(fā)生泄漏窄绒。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,848評論 3 312
  • 文/蒙蒙 一初茶、第九天 我趴在偏房一處隱蔽的房頂上張望颗祝。 院中可真熱鬧,春花似錦恼布、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,726評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至盖腿,卻和暖如春爽待,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背翩腐。 一陣腳步聲響...
    開封第一講書人閱讀 31,952評論 1 264
  • 我被黑心中介騙來泰國打工鸟款, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人茂卦。 一個月前我還...
    沈念sama閱讀 46,271評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親瑟匆。 傳聞我的和親對象是個殘疾皇子芦昔,可洞房花燭夜當晚...
    茶點故事閱讀 43,452評論 2 348

推薦閱讀更多精彩內容