Swift - 函數(shù)

函數(shù)喷众,是用來完成特定任務(wù)的獨(dú)立的代碼塊,指定一個(gè)函數(shù)名莺债,在需要的時(shí)候可以多次調(diào)用滋觉。函數(shù)對于程序員來說并不陌生,今天要分享的就是Swift中函數(shù)的定義齐邦,調(diào)用椎侠,以及一些常見的用法。
(1)函數(shù)的定義和調(diào)用
在Swift中少梁,使用func關(guān)鍵字來定義函數(shù)菌湃,函數(shù)由函數(shù)名树肃,參數(shù),返回值組成浅悉,基本格式如下所示:

 func 函數(shù)名(參數(shù)名1:參數(shù)類型,參數(shù)名2:參數(shù)類型...)->返回值類型{  
    函數(shù)體
    return 返回值
}
func sum(x : Int, y : Int) -> Int {
    return x + y
}

print(sum(x : 10, y: 20))

上面的代碼就定義了一個(gè)用于求和的函數(shù)券犁,函數(shù)的名字是sum术健,參數(shù)類型都為Int類型,返回值也是Int類型粘衬。

(2)函數(shù)的參數(shù)和返回值
在Swift中荞估,函數(shù)的 參數(shù)與返回值使用很靈活咳促,能夠定義任何類型的函數(shù),包括無參函數(shù)勘伺,多參數(shù)函數(shù)跪腹,無返回值函數(shù),多返回值函數(shù)娇昙,當(dāng)然這幾種還可以組合成無參無返回值尺迂,無參多返回值等等。冒掌。噪裕。

無參函數(shù)

func sayHello() -> String {
    return "Hello!"
}

print(sayHello())

上面的代碼定義并且調(diào)用了一個(gè)無參有返回值函數(shù),無需解釋股毫。

多參數(shù)函數(shù)
函數(shù)的參數(shù)可以沒有膳音,也可以有1個(gè)或多個(gè)。在對函數(shù)定義舉例的時(shí)候那個(gè)例子铃诬,求和函數(shù)祭陷,就是一個(gè)多參數(shù)函數(shù),下面再做一個(gè)事例趣席,來展示多參函數(shù)兵志。

func sayHello(name : String, alreadyGreeted : Bool) -> String {
    if alreadyGreeted {
        return "Hello \(name)!"
    } else {
        return "Hello World!"
    }
}

print(sayHello("miao", alreadyGreeted: false))

上面的sayHello函數(shù)中有兩個(gè)參數(shù),一個(gè)String類型的name宣肚,一個(gè)Bool類型的alreadyGreeted想罕,返回值為String類型,函數(shù)體中霉涨,通過對alreadyGreeted的判斷返回不同的字符串按价。。

無返回值的函數(shù)
無返回值函數(shù)的寫法有三種笙瑟,下面直接用代碼給出示例楼镐。

func test1() {
    print("哈哈")
}

func test2() -> Void {
    print("呵呵")
}

func test3() -> () {
    print("吼吼")
}

test1()
test2()
test3()

上面所示的函數(shù),既是無返回值函數(shù)往枷,也是無參函數(shù)框产。

多返回值函數(shù)
是永遠(yuǎn)組類型作為函數(shù)的返回值,可以讓多個(gè)值作為一個(gè)復(fù)合值返回错洁。
下面我們來定義一個(gè)函數(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","b","c","d","e":
            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)
    
}

count("Welcome to 汪小喵的簡書")

(3)局部參數(shù)名和外部參數(shù)名
前面的代碼中定義的函數(shù)中墓臭,都為參數(shù)定義了參數(shù)名蘸鲸,這些參數(shù)名只能在函數(shù)本身的主題中使用,這種參數(shù)類型名稱稱為局部參數(shù)名窿锉,就不用再多解釋了酌摇。
下面來介紹外部參數(shù)名膝舅。
外部參數(shù)名,是指在參數(shù)名的前面在增加一個(gè)參數(shù)名窑多。如果為參數(shù)制定了外部參數(shù)名仍稀,調(diào)用的時(shí)候就必須顯示地使用。下面來舉個(gè)栗子:

func compare(num1 x : Int, num2 y : Int) -> Int {
    return x > y ? x : y
}

compare(num1: 3, num2: 5)
外部參數(shù)名

從截圖中可以看到埂息,當(dāng)調(diào)用compare函數(shù)時(shí)技潘,Xcode會(huì)出現(xiàn)智能提示。

(4)函數(shù)參數(shù)的其他用戶
默認(rèn)參數(shù)值
給參數(shù)一個(gè)默認(rèn)值可以再調(diào)用該函數(shù)式省略這個(gè)參數(shù)千康。來看下面這個(gè)函數(shù)的定義和調(diào)用:

func sayHello(message : String, name : String = "小明") {
    print("\(name),\(message)")
}

sayHello("歡迎來到簡書")
sayHello(message: "歡迎來到簡書", name: "喵喵")

可變參數(shù)
一個(gè)可變參數(shù)可以接受零個(gè)或者多個(gè)指定類型的值享幽。函數(shù)調(diào)用時(shí),使用可變參數(shù)來指定函數(shù)參數(shù)可以被傳入不確定數(shù)量的輸入值拾弃。在變量類型名后面加入“...”的方式來定義可變參數(shù)值桩。下面來定義一個(gè)計(jì)算平均值的函數(shù)。

func arithmenticMean(numbers: Double...) -> Double {
    var total: Double = 0
    for number in numbers {
        total += number
    }
    return total / Double(numbers.count)
}

arithmenticMean(1,2,3,4,5.5)
求平均值

In-Out參數(shù)
一般參數(shù)僅僅在函數(shù)內(nèi)部可以改變豪椿,當(dāng)這個(gè)函數(shù)執(zhí)行完后變量就會(huì)被銷毀奔坟,如果想要通過一個(gè)函數(shù)可以修改參數(shù)的值,并且讓這些修改在函數(shù)調(diào)用結(jié)束后仍然存在搭盾,這時(shí)可以將這個(gè)參數(shù)定義為輸入輸出參數(shù)咳秉。在參數(shù)類型的前面加上 inout 關(guān)鍵字就可以定義一個(gè)輸入輸出函數(shù)。

要注意的是鸯隅, inout 修飾的參數(shù)是不能有默認(rèn)值的澜建,也不能是有范圍的參數(shù)集合,另外滋迈,一個(gè)參數(shù)一旦被 inout修飾霎奢,就不能被let修飾了户誓。

func swapTwoInts(inout a : Int, inout b : Int) {
    let temp = a
    a = b
    b = temp
}
var someInt = 3
var anotherInt = 9
swapTwoInts(&someInt, b: &anotherInt)
print(someInt, anotherInt)
交換兩個(gè)整數(shù)的值

從截圖中可以看到饼灿,在調(diào)用swapTwoInts函數(shù)的時(shí)候,參數(shù)前面都加上了&前綴帝美,盡管someInt和anotherInt在函數(shù)外部碍彭,仍然被交換了數(shù)值。

(5)嵌套函數(shù)
前面定義的函數(shù)都是全局函數(shù)悼潭,也就是定義在全局作用域中庇忌,除了全局函數(shù)外,還可以把函數(shù)定義在其他函數(shù)體中舰褪,就是嵌套函數(shù)皆疹。

func calculate(opr : String) -> (Int, Int) -> (Int) {
    func add(a : Int, b : Int) -> Int {
        return a + b
    }
    
    func sub(a : Int, b : Int) -> Int {
        return a + b
    }
    
    var result : (Int, Int) -> Int
    switch opr {
    case "+":
        result = add
    default:
        result = sub
    }
    return result
}
let f1:(Int, Int) ->Int = calculate("+")
print(f1(5,9))

上面的代碼中,函數(shù)只有一個(gè)參數(shù)占拍,返回值類型是 (Int,Int)->Int類型略就。代碼定義了兩個(gè)嵌套函數(shù)捎迫,用于加法和減法運(yùn)算。

函數(shù)的定義和基本用法就是這么多表牢,明天分享閉包

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末窄绒,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子崔兴,更是在濱河造成了極大的恐慌彰导,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,372評論 6 498
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件敲茄,死亡現(xiàn)場離奇詭異位谋,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)折汞,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,368評論 3 392
  • 文/潘曉璐 我一進(jìn)店門倔幼,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人爽待,你說我怎么就攤上這事损同。” “怎么了鸟款?”我有些...
    開封第一講書人閱讀 162,415評論 0 353
  • 文/不壞的土叔 我叫張陵膏燃,是天一觀的道長。 經(jīng)常有香客問我何什,道長组哩,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,157評論 1 292
  • 正文 為了忘掉前任处渣,我火速辦了婚禮伶贰,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘罐栈。我一直安慰自己黍衙,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,171評論 6 388
  • 文/花漫 我一把揭開白布荠诬。 她就那樣靜靜地躺著琅翻,像睡著了一般。 火紅的嫁衣襯著肌膚如雪柑贞。 梳的紋絲不亂的頭發(fā)上方椎,一...
    開封第一講書人閱讀 51,125評論 1 297
  • 那天,我揣著相機(jī)與錄音钧嘶,去河邊找鬼棠众。 笑死,一個(gè)胖子當(dāng)著我的面吹牛有决,可吹牛的內(nèi)容都是我干的闸拿。 我是一名探鬼主播轿亮,決...
    沈念sama閱讀 40,028評論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼胸墙!你這毒婦竟也來了我注?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,887評論 0 274
  • 序言:老撾萬榮一對情侶失蹤迟隅,失蹤者是張志新(化名)和其女友劉穎但骨,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體智袭,經(jīng)...
    沈念sama閱讀 45,310評論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡奔缠,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,533評論 2 332
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了吼野。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片校哎。...
    茶點(diǎn)故事閱讀 39,690評論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖瞳步,靈堂內(nèi)的尸體忽然破棺而出闷哆,到底是詐尸還是另有隱情,我是刑警寧澤单起,帶...
    沈念sama閱讀 35,411評論 5 343
  • 正文 年R本政府宣布抱怔,位于F島的核電站,受9級特大地震影響嘀倒,放射性物質(zhì)發(fā)生泄漏屈留。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,004評論 3 325
  • 文/蒙蒙 一测蘑、第九天 我趴在偏房一處隱蔽的房頂上張望灌危。 院中可真熱鬧,春花似錦碳胳、人聲如沸勇蝙。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,659評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽浅蚪。三九已至藕帜,卻和暖如春烫罩,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背洽故。 一陣腳步聲響...
    開封第一講書人閱讀 32,812評論 1 268
  • 我被黑心中介騙來泰國打工贝攒, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人时甚。 一個(gè)月前我還...
    沈念sama閱讀 47,693評論 2 368
  • 正文 我出身青樓隘弊,卻偏偏與公主長得像哈踱,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子梨熙,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,577評論 2 353

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

  • 函數(shù)是用來完成特定任務(wù)的獨(dú)立的代碼塊开镣。給一個(gè)函數(shù)起一個(gè)合適的名字,用來標(biāo)識(shí)函數(shù)做什么咽扇,并且當(dāng)函數(shù)需要執(zhí)行的時(shí)候邪财,這...
    窮人家的孩紙閱讀 810評論 2 1
  • 函數(shù)是用來完成特定任務(wù)的獨(dú)立的代碼塊≈视可以給函數(shù)起一個(gè)名字树埠,用于標(biāo)識(shí)一個(gè)函數(shù),當(dāng)函數(shù)需要執(zhí)行的時(shí)候嘶伟,這個(gè)名字就會(huì)用...
    EndEvent閱讀 743評論 1 3
  • Swift 函數(shù)用來完成特定任務(wù)的獨(dú)立的代碼塊怎憋。Swift使用一個(gè)統(tǒng)一的語法來表示簡單的C語言風(fēng)格的函數(shù)到復(fù)雜的O...
    零度_不結(jié)冰閱讀 321評論 0 0
  • 一般情況下,人都是安于現(xiàn)狀的九昧,這是一件可怕的事情绊袋。 人的命運(yùn),有人說是靠天命铸鹰,有人說是性格決定的愤炸,...
    就是吳祥閱讀 217評論 0 2
  • 學(xué)習(xí)記錄 我們生活在這個(gè)世界规个,創(chuàng)造美好生活是我們初來這個(gè)世界時(shí)第一愿望。那么如何實(shí)現(xiàn)這個(gè)愿望姓建, 是需要...
    林中蔓步閱讀 215評論 0 0