swift 函數(shù) (方法)

一珊拼、函數(shù)的定義

注意??:函數(shù)參數(shù)默認情況下是 let 參數(shù)的值是不能更改的
函數(shù)的形式

func 函數(shù)名稱(參數(shù))->(返回值類型){
   return  返回值
}

其中函數(shù)參數(shù)可有可無盾计,參數(shù)的個數(shù)可以有一個也可以有多個
函數(shù)的返回值 可有可無 如下例子

1搞糕、無參數(shù)钙皮、無返回值

//MARK: -- 沒有返回參數(shù)的函數(shù)
func sayHello(){
    print("Hellow")
}

2蜂科、有參數(shù) 無返回值

func sayHelloToSomeone(_ name:String){
    print("Hellow \(name)")
}

3、無參數(shù) 有返回值

func p() -> CGFloat{
    return 3.14
}

4短条、有參數(shù) 有返回值

func sum(_ v1:Int,_ v2:Int) -> Int{
    return  v1 + v2
}

二导匣、隱式返回

如果整個函數(shù)體是一個單一表達式,那么函數(shù)會隱式返回這個表達式(也就是說可以把關(guān)鍵字 return 省掉 )
例如

func sum(_ v1:Int,_ v2:Int) -> Int{
     v1 + v2
}

三茸时、返回元組:實現(xiàn)多個返回值

func calculate(v1: Int, v2: Int) -> (sum: Int, difference: Int, average: Int) {
    let sum = v1 + v2
    return (sum, v1 - v2, sum >> 1)
}

四贡定、函數(shù)中的參數(shù)標簽

函數(shù)中 參數(shù)明可以帶標簽
例如

func sum(unmber1 v1:Int,unmber1 v2:Int) -> Int{
    return  v1 + v2
}

調(diào)用方式
sum(unmber1: 10, unmber1: 20)

這里的 unmber1 和 unmber1 就是參數(shù)的標簽

再比如

func goToWork(at time: String) {
    print("this time is \(time)")
}

調(diào)用方式
goToWork(at: "08:00")

這里的at 就是參數(shù)的標簽

標簽的作用就是提示 標簽可以使用 _ 來代替

func sum(_ v1:Int,_ v2:Int) -> Int{
    return  v1 + v2
}

五、函數(shù)中的默認參數(shù)

函數(shù)中默認參數(shù)指的是賦了初始值的參數(shù)可都,在調(diào)用函數(shù)的時候 默認參數(shù)可傳也可不傳

func check(name: String = "nobody", age: Int, job: String = "none") {

    print("name=\(name), age=\(age), job=\(job)")
}

check(name: "Jack", age: 20, job: "Doctor") // name=Jack, age=20, job=Doctor
check(name: "Rose", age: 18) // name=Rose, age=18, job=none
check(age: 10, job: "Batman") // name=nobody, age=10, job=Batman
check(age: 15) // name=nobody, age=15, job=none

如上述函數(shù)中 name 缓待、job 都有默認值 age 沒有默認值 所以在調(diào)用函數(shù)的時候 除了age不能為空 其他均可不傳

注意??:函數(shù)中有默認參數(shù)時 一定要注意 必填參數(shù)有時不能省略標簽
比如

func test(_ first: Int = 10, middle: Int, _ last: Int = 30) { }
test(middle: 20)

如果上面函數(shù)的 middle參數(shù)的標簽省略 在調(diào)用 test函數(shù)的時候就不知道你傳的參數(shù)是哪個 所以會報錯
如下圖


截屏2021-12-15 下午2.50.10.png

六、函數(shù)中的可變參數(shù)

也就是說函數(shù)的參數(shù)不固定 可以為一個 也可以為多個
例如

func sum(_ numbers: Int...) -> Int {
    var total = 0
    for number in numbers {
        total += number
    }
    return total
}

sum(10, 20, 30, 40)

注意??:
1渠牲、一個函數(shù)最多只能有一個可變參數(shù)
2旋炒、緊跟在可變參數(shù)后面的參數(shù) 不能省略標簽

func test(_ numbers: Int..., string: String, _ other: String) { }
test(10, 20, 30, string: "Jack", "Rose")

test函數(shù)的 string 參數(shù)不能省略標簽

如果省略就會報錯 如下圖所示
截屏2021-12-15 下午2.58.53.png

原因是:如果緊跟在可變參數(shù)后面的參數(shù)省略了標簽 可變參數(shù)不知道從哪里結(jié)束 然后就把 后面的參數(shù)來當成是可變參數(shù) 所有就會報錯

七、函數(shù)中的輸入輸出函數(shù)(inout)

可以用inout定義一個輸入輸出參數(shù):
作用:可以在函數(shù)內(nèi)部修改外部實參

例如

func swapValues(_ v1: inout Int, _ v2: inout Int) {
    let tmp = v1
    v1 = v2
    v2 = tmp
}
var num1 = 10
var num2 = 20
swapValues(&num1, &num2)

可變參數(shù)不能標記為inout
inout參數(shù)不能有默認值
inout參數(shù)只能傳入可以被多次賦值的
inout參數(shù)的本質(zhì)是地址傳遞(引用傳遞 也就是將參數(shù)的地址傳遞過去 然后根據(jù)地址去修改地址存的值)

八签杈、函數(shù)重載

規(guī)則
1瘫镇、函數(shù)名相同
2、參數(shù)個數(shù)不同 || 參數(shù)類型不同 || 參數(shù)標簽不同

func sum(v1: Int, v2: Int) -> Int {
    v1 + v2
}

// 參數(shù)個數(shù)不同

func sum(v1: Int, v2: Int, v3: Int) -> Int {
    v1 + v2 + v3
}

// 參數(shù)類型不同

func sum(v1: Int, v2: Double) -> Double {
    Double(v1) + v2
}

// 參數(shù)類型不同

func sum(v1: Double, v2: Int) -> Double {
    v1 + Double(v2)
}

// 參數(shù)標簽不同

func sum(_ v1: Int, _ v2: Int) -> Int {
    v1 + v2
}

// 參數(shù)標簽不同

func sum(a: Int, b: Int) -> Int {
    a + b
}

注意??:
返回值類型與函數(shù)重載無關(guān)
默認參數(shù)值和函數(shù)重載一起使用產(chǎn)生二義性時答姥,編譯器并不會報錯(在C++中會報錯)
可變參數(shù)铣除、省略參數(shù)標簽、函數(shù)重載一起使用產(chǎn)生二義性時鹦付,編譯器有可能會報錯

九尚粘、內(nèi)聯(lián)函數(shù)

使用@inline(never) 修飾函數(shù) 這個函數(shù)永遠不會被內(nèi)聯(lián)(即使開啟了編譯器優(yōu)化)

@inline(never) func test() {
  print("test") 
}

使用@inline(__always) 修飾函數(shù) 開啟編譯器優(yōu)化后,即使代碼很長敲长,也會被內(nèi)聯(lián)(遞歸調(diào)用函數(shù)背苦、動態(tài)派發(fā)的函數(shù)除外)

@inline(__always) func test() {
 print("test")
 }

在Release模式下互捌,編譯器已經(jīng)開啟優(yōu)化,會自動決定哪些函數(shù)需要內(nèi)聯(lián)行剂,因此沒必要使用@inline

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末秕噪,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子厚宰,更是在濱河造成了極大的恐慌腌巾,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,284評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件铲觉,死亡現(xiàn)場離奇詭異澈蝙,居然都是意外死亡,警方通過查閱死者的電腦和手機撵幽,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,115評論 3 395
  • 文/潘曉璐 我一進店門灯荧,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人盐杂,你說我怎么就攤上這事逗载。” “怎么了链烈?”我有些...
    開封第一講書人閱讀 164,614評論 0 354
  • 文/不壞的土叔 我叫張陵厉斟,是天一觀的道長。 經(jīng)常有香客問我强衡,道長擦秽,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,671評論 1 293
  • 正文 為了忘掉前任漩勤,我火速辦了婚禮感挥,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘越败。我一直安慰自己触幼,他們只是感情好,可當我...
    茶點故事閱讀 67,699評論 6 392
  • 文/花漫 我一把揭開白布眉尸。 她就那樣靜靜地躺著域蜗,像睡著了一般巨双。 火紅的嫁衣襯著肌膚如雪噪猾。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,562評論 1 305
  • 那天筑累,我揣著相機與錄音袱蜡,去河邊找鬼。 笑死慢宗,一個胖子當著我的面吹牛坪蚁,可吹牛的內(nèi)容都是我干的奔穿。 我是一名探鬼主播,決...
    沈念sama閱讀 40,309評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼敏晤,長吁一口氣:“原來是場噩夢啊……” “哼贱田!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起嘴脾,我...
    開封第一講書人閱讀 39,223評論 0 276
  • 序言:老撾萬榮一對情侶失蹤男摧,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后译打,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體耗拓,經(jīng)...
    沈念sama閱讀 45,668評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,859評論 3 336
  • 正文 我和宋清朗相戀三年奏司,在試婚紗的時候發(fā)現(xiàn)自己被綠了乔询。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,981評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡韵洋,死狀恐怖竿刁,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情麻献,我是刑警寧澤们妥,帶...
    沈念sama閱讀 35,705評論 5 347
  • 正文 年R本政府宣布,位于F島的核電站勉吻,受9級特大地震影響监婶,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜齿桃,卻給世界環(huán)境...
    茶點故事閱讀 41,310評論 3 330
  • 文/蒙蒙 一惑惶、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧短纵,春花似錦带污、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,904評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至悠就,卻和暖如春千绪,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背梗脾。 一陣腳步聲響...
    開封第一講書人閱讀 33,023評論 1 270
  • 我被黑心中介騙來泰國打工荸型, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人炸茧。 一個月前我還...
    沈念sama閱讀 48,146評論 3 370
  • 正文 我出身青樓瑞妇,卻偏偏與公主長得像稿静,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子辕狰,可洞房花燭夜當晚...
    茶點故事閱讀 44,933評論 2 355