Swift 中的函數(shù)

返回值

沒(méi)有定義返回類(lèi)型的函數(shù),事實(shí)上靠益,會(huì)返回一個(gè)類(lèi)型為Void的特殊值丧肴。
它是一個(gè)空的元組,寫(xiě)為()胧后。

函數(shù)可以以元組的形式返回多個(gè)值芋浮。
定義返回類(lèi)型時(shí)可以命名元組成員,這樣壳快,當(dāng)元組返回時(shí)纸巷,可以通過(guò)所命名的名字訪(fǎng)問(wèn)镇草。

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([8, -6, 2, 109, 3, 71])
println("min is \(bounds.0) and max is \(bounds.1)")
println("min is \(bounds.min) and max is \(bounds.max)")

如果元組可能是空,可以使用 optional tuple瘤旨,來(lái)說(shuō)明函數(shù)的返回值可能為nil梯啤。

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([8, -6, 2, 109, 3, 71]) {
    println("min is \(bounds.min) and max is \(bounds.max)")
}

(注意(Int, Int)?(Int?, Int?)的區(qū)別)

參數(shù)名

外部參數(shù)名

可以為函數(shù)參數(shù)提供外部參數(shù)名(相較于只能在函數(shù)體內(nèi)部使用的局部參數(shù)名)。
之后存哲,調(diào)用函數(shù)時(shí)因宇,就將參數(shù)值與外部參數(shù)名一一對(duì)應(yīng)。(當(dāng)定義了外部參數(shù)名祟偷,調(diào)用函數(shù)時(shí)就必須使用)

func someFunction(externalParameterName localParameterName: Int) {
    // function body goes here, and can use localParameterName
    // to refer to the argument value for that parameter
}

考慮下面的例子:使用了外部函數(shù)名的函數(shù)在調(diào)用時(shí)更具有表達(dá)力察滑。

func join(s1: String, s2: String, joiner: String) -> String {
    return s1 + joiner + s2
}
join("hello", "world", ", ")

func join(string s1: String, toString s2: String, withJoiner joiner: String)
    -> String {
        return s1 + joiner + s2
}
join(string: "hello", toString: "world", withJoiner: ", ")

定義外部參數(shù)名時(shí),如果想重用局部參數(shù)名肩袍,可以使用#localParameterName語(yǔ)法糖杭棵。

func containsCharacter(#string: String, #characterToFind: Character) -> Bool {
    for character in string {
        if character == characterToFind {
            return true
        }
    }
    return false
}

let containsAVee = containsCharacter(string: "aardvark", characterToFind: "v")

如果函數(shù)參數(shù)有默認(rèn)值,該參數(shù)必定有一個(gè)外部參數(shù)名氛赐。
如果沒(méi)有顯示的提供魂爪,Swift 會(huì)自動(dòng)提供一個(gè)與局部參數(shù)名一樣的外部參數(shù)名。
見(jiàn)如下示例:

func join(string s1: String, toString s2: String,
    withJoiner joiner: String = " ") -> String {
        return s1 + joiner + s2
}
join(string: "hello", toString: "world", withJoiner: "-")
join(string: "hello", toString: "world")


func join(s1: String, s2: String, joiner: String = " ") -> String {
    return s1 + joiner + s2
}
join("hello", "world", joiner: "-")
join("hello", "world")

當(dāng)函數(shù)中還有變長(zhǎng)參數(shù)時(shí)艰管,變長(zhǎng)參數(shù)始終出現(xiàn)在參數(shù)列表的末尾(變長(zhǎng)參數(shù)會(huì)被收集到一個(gè)數(shù)組中)滓侍,
亦即出現(xiàn)在所有有默認(rèn)值的參數(shù)后面,這也是為什么必須有默認(rèn)值的參數(shù)提供外部參數(shù)名(不然會(huì)產(chǎn)生二義)牲芋。
由此也可知道撩笆,一個(gè)函數(shù)最多只能有一個(gè)變長(zhǎng)參數(shù)。

變量參數(shù)

函數(shù)參數(shù)默認(rèn)都是常量(在函數(shù)體中試圖改變參數(shù)的值會(huì)引起編譯錯(cuò)誤)缸浦。
可以在定義函數(shù)時(shí)給參數(shù)添加var前綴來(lái)定義變量參數(shù)夕冲,這會(huì)為函數(shù)提供一個(gè)可修改的參數(shù)值拷貝。
(注意裂逐,修改變量參數(shù)并不會(huì)改變?cè)瓍?shù)歹鱼,這是 In-Out 參數(shù)的功能)

func alignRight(var string: String, count: Int, pad: Character) -> String {
    let amountToPad = count - countElements(string)
    if amountToPad < 1 {
        return string
    }
    let padString = String(pad)
    for _ in 1...amountToPad {
        string = padString + string
    }
    return string
}

let originalString = "hello"
let paddedString = alignRight(originalString, 10, "-")
// paddedString is equal to "-----hello"
// originalString is still equal to "hello"

In-Out 參數(shù)

函數(shù)中對(duì) In-Out 參數(shù)的修改可以在函數(shù)調(diào)用后依舊保持。
函數(shù)調(diào)用時(shí)卜高,傳遞的參數(shù)必須是變量弥姻。
In-Out 參數(shù)與具有默認(rèn)值的參數(shù)和變長(zhǎng)參數(shù)不兼容。

func swapTwoInts(inout a: Int, inout b: Int) {
    let temporaryA = a
    a = b
    b = temporaryA
}

var someInt = 3
var anotherInt = 107
swapTwoInts(&someInt, &anotherInt)
println("someInt is now \(someInt), and anotherInt is now \(anotherInt)")

函數(shù)類(lèi)型

函數(shù)可傳遞掺涛,可返回庭敦,可嵌套,概念與 Scala 中的函數(shù)類(lèi)似薪缆。

特殊說(shuō)明:無(wú)參數(shù)無(wú)返回類(lèi)型的函數(shù)類(lèi)型為 () -> ()秧廉。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子定血,更是在濱河造成了極大的恐慌赔癌,老刑警劉巖,帶你破解...
    沈念sama閱讀 207,248評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件澜沟,死亡現(xiàn)場(chǎng)離奇詭異灾票,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)茫虽,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,681評(píng)論 2 381
  • 文/潘曉璐 我一進(jìn)店門(mén)刊苍,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人濒析,你說(shuō)我怎么就攤上這事正什。” “怎么了号杏?”我有些...
    開(kāi)封第一講書(shū)人閱讀 153,443評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵婴氮,是天一觀(guān)的道長(zhǎng)。 經(jīng)常有香客問(wèn)我盾致,道長(zhǎng)主经,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 55,475評(píng)論 1 279
  • 正文 為了忘掉前任庭惜,我火速辦了婚禮罩驻,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘护赊。我一直安慰自己惠遏,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,458評(píng)論 5 374
  • 文/花漫 我一把揭開(kāi)白布骏啰。 她就那樣靜靜地躺著节吮,像睡著了一般。 火紅的嫁衣襯著肌膚如雪判耕。 梳的紋絲不亂的頭發(fā)上狡刘,一...
    開(kāi)封第一講書(shū)人閱讀 49,185評(píng)論 1 284
  • 那天缤言,我揣著相機(jī)與錄音遣总,去河邊找鬼构蹬。 笑死六水,一個(gè)胖子當(dāng)著我的面吹牛颅围,可吹牛的內(nèi)容都是我干的粘我。 我是一名探鬼主播聂薪,決...
    沈念sama閱讀 38,451評(píng)論 3 401
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼瞭亮,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼方仿!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 37,112評(píng)論 0 261
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤仙蚜,失蹤者是張志新(化名)和其女友劉穎此洲,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體委粉,經(jīng)...
    沈念sama閱讀 43,609評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡呜师,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,083評(píng)論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了贾节。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片汁汗。...
    茶點(diǎn)故事閱讀 38,163評(píng)論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖栗涂,靈堂內(nèi)的尸體忽然破棺而出知牌,到底是詐尸還是另有隱情,我是刑警寧澤斤程,帶...
    沈念sama閱讀 33,803評(píng)論 4 323
  • 正文 年R本政府宣布角寸,位于F島的核電站,受9級(jí)特大地震影響忿墅,放射性物質(zhì)發(fā)生泄漏扁藕。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,357評(píng)論 3 307
  • 文/蒙蒙 一球匕、第九天 我趴在偏房一處隱蔽的房頂上張望纹磺。 院中可真熱鬧,春花似錦亮曹、人聲如沸橄杨。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,357評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)式矫。三九已至,卻和暖如春役耕,著一層夾襖步出監(jiān)牢的瞬間采转,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,590評(píng)論 1 261
  • 我被黑心中介騙來(lái)泰國(guó)打工瞬痘, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留故慈,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 45,636評(píng)論 2 355
  • 正文 我出身青樓框全,卻偏偏與公主長(zhǎng)得像察绷,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子津辩,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,925評(píng)論 2 344

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

  • 一拆撼、引言 函數(shù)是有特定功能的代碼段容劳,函數(shù)會(huì)有一個(gè)特定的名稱(chēng)調(diào)用時(shí)來(lái)使用。Swift提供了十分靈活的方式來(lái)創(chuàng)...
    0哲思0閱讀 572評(píng)論 0 0
  • 1. 函數(shù)的參數(shù)與返回值 1.1 多重返回值函數(shù) 你可以用元組(tuple)類(lèi)型讓多個(gè)值作為一個(gè)復(fù)合值從函數(shù)中返 ...
    keisme閱讀 449評(píng)論 0 0
  • 86.復(fù)合 Cases 共享相同代碼塊的多個(gè)switch 分支 分支可以合并, 寫(xiě)在分支后用逗號(hào)分開(kāi)闸度。如果任何模式...
    無(wú)灃閱讀 1,347評(píng)論 1 5
  • 函數(shù)是用來(lái)完成特定任務(wù)的獨(dú)立的代碼塊竭贩。給一個(gè)函數(shù)起一個(gè)合適的名字,用來(lái)標(biāo)識(shí)函數(shù)做什么莺禁,并且當(dāng)函數(shù)需要執(zhí)行的時(shí)候留量,這...
    窮人家的孩紙閱讀 806評(píng)論 2 1
  • 函數(shù) 和oc中的函數(shù)一樣, 代碼實(shí)現(xiàn) 函數(shù)的定義格式 func 函數(shù)名(行參列表) -> 返回值 {代碼實(shí)現(xiàn)}調(diào)用...
    伊蕊飄零閱讀 660評(píng)論 0 0