函數(shù)

一. swift函數(shù)允許用元組作為返回值蜂林,以達(dá)到函數(shù)返回多個值的目的吞杭。

// 用元祖作為函數(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ǎn):

  • minMax函數(shù)返回了一個包含兩個 Int 值的元組稚矿。但是函數(shù)不會對傳入數(shù)組執(zhí)行任何安全檢查,如果 array 參數(shù)是一個空數(shù)組骚勘,那么minMax在試圖訪問 array[0] 時會觸發(fā)一個運(yùn)行時錯誤(runtime error)隘膘。為了安全地處理這個“空數(shù)組”問題疑故,將 minMax(_:) 函數(shù)改寫為使用可選元組返回類型,并且當(dāng)數(shù)組為空時返回 nil弯菊;寫法如下:
    func minMax(array: [Int]) -> (min: Int, max: Int?) { ... }
  • 由于元組的成員值已被命名纵势,所以可以通過點(diǎn)語法來檢索到最小值或最大值,并且元祖的成員不需要在元祖從函數(shù)中返回時命名管钳,因為它們的名字已經(jīng)在函數(shù)返回類型中指定了钦铁。
let bounds = minMax(array: [8, -6, 2, 109, 3, 71])
print("min is \(bounds.min) and max is \(bounds.max)")

二. 函數(shù)的參數(shù)

每個函數(shù)的參數(shù)都有一個參數(shù)標(biāo)簽(Argument Label)以及參數(shù)名稱(Parateter Name)。不指定的情況下才漆,參數(shù)名稱就是函數(shù)參數(shù)的參數(shù)標(biāo)簽牛曹。
參數(shù)名稱在函數(shù)實(shí)現(xiàn)中使用;
參數(shù)標(biāo)簽在函數(shù)調(diào)用時使用醇滥;
參數(shù)標(biāo)簽寫在參數(shù)名稱前面黎比,以空格分開。
一個函數(shù)中多個參數(shù)的參數(shù)名稱唯一腺办,參數(shù)標(biāo)簽可重復(fù)焰手,但不推薦。

1. 參數(shù)標(biāo)簽使用:讓函數(shù)類似自然語言怀喉,提高了可讀性书妻。
func foo(person name: String, from hometown: String) {
    print(name)
}
foo(person: "lzf", from: "china")
2. 忽略參數(shù)標(biāo)簽:如果想隱藏(忽略)參數(shù)標(biāo)簽,用下劃線_代替躬拢。
func someFunc(_ age: Int, height: Double) {}
someFunc(20, height: 178)
3. 默認(rèn)參數(shù)值:通過給參數(shù)賦值定義默認(rèn)參數(shù)值躲履,函數(shù)調(diào)用時可忽略此參數(shù)。 
   也可以對此參數(shù)重新賦值聊闯,調(diào)用函數(shù)時會出現(xiàn)兩個函數(shù)提示工猜!
   一般將帶有默認(rèn)值的參數(shù)放在最后,函數(shù)調(diào)用時語意更清晰菱蔬。如下:
func someFunc(height: Double, age: Int = 20) {}
someFunc(height: 178)
  // 或者
someFunc(height: 180, age: 18)
4. 可變參數(shù):一個可變參數(shù)可以接收零個或多個值篷帅。
   通過在變量類型名后加...來定義可變參數(shù)史侣,
   可變參數(shù)的傳入值在函數(shù)體中變?yōu)榇祟愋偷臄?shù)組。
   注意:一個函數(shù)中只能有一個可變參數(shù)魏身。
 
// 計算一組任意長度數(shù)字的算術(shù)平均值
func average(_ numbers: Double...) -> Double { 
    var total: Double = 0
    for number in numbers {
        total += number
    }
    return total / Double(numbers.count)
}
average(1, 2, 37, 48, 19, 199)

輸入輸出參數(shù):函數(shù)參數(shù)默認(rèn)是常量惊橱。試圖在函數(shù)體中更改參數(shù)值將會導(dǎo)致編譯錯誤(compile-time error)。這意味著你不能錯誤地更改參數(shù)值箭昵。如果你想要一個函數(shù)可以修改參數(shù)的值税朴,并且想要在這些修改在函數(shù)調(diào)用結(jié)束后仍然存在,那么就應(yīng)該把這個參數(shù)定義為輸入輸出參數(shù)(In-Out Parameters)家制。

定義一個輸入輸出參數(shù)時正林,在參數(shù)定義前加 inout 關(guān)鍵字。一個輸入輸出參數(shù)有傳入函數(shù)的值颤殴,這個值被函數(shù)修改觅廓,然后被傳出函數(shù),替換原來的值诅病。想獲取更多的關(guān)于輸入輸出參數(shù)的細(xì)節(jié)和相關(guān)的編譯器優(yōu)化哪亿,請查看輸入輸出參數(shù)一節(jié)。

你只能傳遞變量給輸入輸出參數(shù)贤笆。你不能傳入常量或者字面量(literal value),因為這些量是不能被修改的讨阻。當(dāng)傳入的參數(shù)作為輸入輸出參數(shù)時芥永,需要在參數(shù)名前加 & 符,表示這個值可以被函數(shù)修改钝吮。

注意:輸入輸出參數(shù)不能有默認(rèn)值埋涧,而且可變參數(shù)不能用 inout 標(biāo)記!F媸荨棘催!

5. 輸入輸出參數(shù):在變量名前面加 inout 關(guān)鍵字
// 定義函數(shù)交換兩個整型變量的值
func swapInts(_ a: inout Int, _ b: inout Int) {
    let tempA = a
    a = b
    b = tempA
}

var intA = 3
var intB = 120
swapInts(&intA, &intB)
print("intA = \(intA)\nintB = \(intB) ")

上面的例子中,intA和intB的原始值在函數(shù)中被修改了耳标,盡管他們定義在函數(shù)體外醇坝。注意:輸入輸出參數(shù)和函數(shù)返回值時不一樣的。上面的函數(shù)并沒有定義返回值次坡。所以呼猪,輸入輸出參數(shù)是函數(shù)對函數(shù)體外的變量產(chǎn)生影響的方式之一。


三. 函數(shù)的類型

在swift中砸琅,使用函數(shù)類型就像使用其他類型一樣宋距。你可以定義一個類型為函數(shù)的常量或變量,并將相同類型的函數(shù)賦值給它:

func add(_ a: Int, _ b: Int) -> Int { // 加法
    return a + b
}
func multiply(_ a: Int, _ b: Int) -> Int { // 乘法
    return a + b
}
// 1.將add函數(shù)賦值給函數(shù)變量mathFunc
var mathFunc: (Int, Int) -> Int = add
// 2.然后用mathFunc調(diào)用add函數(shù)
mathFunc(10, 20)
// 3.也可以將multiply函數(shù)賦值給mathFunc症脂,因為它們函數(shù)類型一樣
mathFunc = multiply
mathFunc(10, 20)
// 4.和其他類型一樣谚赎,將函數(shù)賦值給一個常量或變量時淫僻,swift會自動推導(dǎo)類型:
let anotherMathFunc = add // 被推導(dǎo)為(Int, Int) -> Int類型函數(shù)
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市壶唤,隨后出現(xiàn)的幾起案子嘁傀,更是在濱河造成了極大的恐慌,老刑警劉巖视粮,帶你破解...
    沈念sama閱讀 206,311評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件细办,死亡現(xiàn)場離奇詭異,居然都是意外死亡蕾殴,警方通過查閱死者的電腦和手機(jī)笑撞,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,339評論 2 382
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來钓觉,“玉大人茴肥,你說我怎么就攤上這事〉丛郑” “怎么了瓤狐?”我有些...
    開封第一講書人閱讀 152,671評論 0 342
  • 文/不壞的土叔 我叫張陵,是天一觀的道長批幌。 經(jīng)常有香客問我础锐,道長,這世上最難降的妖魔是什么荧缘? 我笑而不...
    開封第一講書人閱讀 55,252評論 1 279
  • 正文 為了忘掉前任皆警,我火速辦了婚禮,結(jié)果婚禮上截粗,老公的妹妹穿的比我還像新娘信姓。我一直安慰自己,他們只是感情好绸罗,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,253評論 5 371
  • 文/花漫 我一把揭開白布意推。 她就那樣靜靜地躺著,像睡著了一般珊蟀。 火紅的嫁衣襯著肌膚如雪菊值。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,031評論 1 285
  • 那天系洛,我揣著相機(jī)與錄音俊性,去河邊找鬼。 笑死描扯,一個胖子當(dāng)著我的面吹牛定页,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播绽诚,決...
    沈念sama閱讀 38,340評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼典徊,長吁一口氣:“原來是場噩夢啊……” “哼杭煎!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起卒落,我...
    開封第一講書人閱讀 36,973評論 0 259
  • 序言:老撾萬榮一對情侶失蹤羡铲,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后儡毕,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體也切,經(jīng)...
    沈念sama閱讀 43,466評論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,937評論 2 323
  • 正文 我和宋清朗相戀三年腰湾,在試婚紗的時候發(fā)現(xiàn)自己被綠了雷恃。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,039評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡费坊,死狀恐怖倒槐,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情附井,我是刑警寧澤讨越,帶...
    沈念sama閱讀 33,701評論 4 323
  • 正文 年R本政府宣布,位于F島的核電站永毅,受9級特大地震影響把跨,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜卷雕,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,254評論 3 307
  • 文/蒙蒙 一节猿、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧漫雕,春花似錦、人聲如沸峰鄙。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,259評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽吟榴。三九已至魁蒜,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間吩翻,已是汗流浹背兜看。 一陣腳步聲響...
    開封第一講書人閱讀 31,485評論 1 262
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留狭瞎,地道東北人细移。 一個月前我還...
    沈念sama閱讀 45,497評論 2 354
  • 正文 我出身青樓,卻偏偏與公主長得像熊锭,于是被迫代替她去往敵國和親弧轧。 傳聞我的和親對象是個殘疾皇子雪侥,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,786評論 2 345

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

  • 本章將會介紹 控制流For-In 循環(huán)While 循環(huán)If 條件語句Switch 語句控制轉(zhuǎn)移語句 continu...
    寒橋閱讀 714評論 0 0
  • 函數(shù)是用來完成特定任務(wù)的獨(dú)立的代碼塊速缨。給一個函數(shù)起一個合適的名字,用來標(biāo)識函數(shù)做什么代乃,并且當(dāng)函數(shù)需要執(zhí)行的時候旬牲,這...
    窮人家的孩紙閱讀 805評論 2 1
  • php usleep() 函數(shù)延遲代碼執(zhí)行若干微秒。 unpack() 函數(shù)從二進(jìn)制字符串對數(shù)據(jù)進(jìn)行解包搁吓。 uni...
    思夢PHP閱讀 1,981評論 1 24
  • [The Swift Programming Language 中文版]本頁包含內(nèi)容: 函數(shù)是用來完成特定任務(wù)的獨(dú)...
    風(fēng)林山火閱讀 474評論 0 0
  • 我對愛情原茅,有著各種幻想。 年少時擎浴,我只是一個普通的女孩员咽,普通到畢業(yè)后多年,路遇高中的同學(xué)贮预,大家都熱烈的打著招呼贝室,卻...
    青花古瓷閱讀 279評論 0 2