Swift 函數(shù)調(diào)用到底寫不寫參數(shù)名靖榕?


最近真正開始學 Swift标锄,在調(diào)用函數(shù)的時候遇到一個問題:到底寫不寫函數(shù)名?

我們來看兩個個例子:

// 1
func test(a: Int, b: Int) ->Int {
  return a + b
}

test(a: 1, b: 1) // (A)
test(1, b:1) // (B)

//2
class Test {
  var name: String
  var age: Int

  init(name: String, age: Int) {
    self.name = name
    self.age = age
  }

  func sayHello(word: String, place: String) {
    println("Hello \(self.name), \(word) at \(place)")
  }
}

var test = Test("Jack", age: 12) // (C)
test.sayHello(word: "nice to meet you", place: "Beijing") // (D)

(A)茁计、(B)料皇、(C)(D)四處調(diào)用星压,哪個會報錯践剂?













Playground




租幕。

好吧舷手,如果你還是直接翻到這里,那我也無能為力了劲绪。

答案是:四處全部報錯

正確的寫法是:

test(1, 1)
var test = Test(name: "Jack", age: 12)
test.sayHello("nice to meet you", place: "Beijing")

腳麻了嗎盆赤?麻了就對了贾富,我跺我也麻。

我這智商基本告別 Swift 了

到底咋回事


首先我們要清楚牺六,Swift 中的調(diào)用有三種:

  • 函數(shù)調(diào)用(閉包也歸于函數(shù)颤枪,雖然所有函數(shù)本質(zhì)上都是閉包。這句話看不懂的自動跳過淑际,只是為了防人摳字眼)
  • 類初始化
  • 方法調(diào)用

如果沒有參數(shù)畏纲,那自然直接()調(diào)用,因此下面的討論前提是需要傳參春缕,并且傳參數(shù)量大于一盗胀。

上一節(jié)的例子就是典型的三種調(diào)用,傳參的時候正確寫法如下:

<函數(shù)名>(參數(shù)值锄贼,參數(shù)值...) // 不加任何參數(shù)名票灰,直接寫參數(shù)值

<實例>.<方法名>(參數(shù)值,參數(shù)名:參數(shù)值,參數(shù)名:參數(shù)值...) // 方法調(diào)用第一個參數(shù)不寫參數(shù)名屑迂,后面的全部要寫浸策。特殊情況是尾閉包,往下看

<類初始化>(參數(shù)名:參數(shù)值惹盼,參數(shù)名:參數(shù)值...) // 類初始化所有參數(shù)都需要加參數(shù)名

單個函數(shù)的調(diào)用很好理解庸汗,其他語言里也大多是這么做的。我們主要解釋方法調(diào)用和類初始化這兩種調(diào)用手报。

為什么 Swift 對方法調(diào)用和類初始化的參數(shù)名有如此奇怪的限制夫晌?主要原因是繼承 Objective-C 的一貫傳統(tǒng)。我們來看看 OC 里面的寫法:

 [person setName:@"sam" andSecondName:@"job"]

setName是方法名昧诱,后面緊跟第一個參數(shù)晓淀,對應 Swift 中的寫法是:

person.setName("sam", andSecondName: "job")

也就是說,方法名中已經(jīng)隱含了第一個參數(shù)的名字(雖然我們不知道第一個參數(shù)名是什么盏档,但是顯然第一個參數(shù)是Name凶掰,我們就可以知道第一個參數(shù)是名字),所以省略第一個參數(shù)名蜈亩。

那么init為什么要加上第一個參數(shù)名懦窘?

直接看代碼:

[Test initWith:"Sam", andSecondName: "job"] // oc
Test(name: "Sam", andSecondName: "job") / swift

由于 Swift 中初始化時候直接使用類名,沒有方法名稚配,所以第一個參數(shù)名就不能省略了畅涂。

特殊情況


下面介紹幾種特殊情況。

尾閉包

首先是尾閉包道川。

Swift 中許多方法的最后一個參數(shù)是handler午衰,我們可以傳入一個閉包。由于閉包寫到參數(shù)列表里比較繁瑣冒萄,Swift 提供了一種新寫法:尾閉包臊岸。看例子:

alert.addAction(UIAlertAction(title: "OK", style: UIAlertActionStyle.Default) {
  ......
})

UIAlertAction的最后一個參數(shù)是handler尊流,這里用尾閉包來寫的話帅戒,就是在右括號后面直接加閉包。當然崖技,你也可以把閉包寫到參數(shù)列表里逻住,只是需要加參數(shù)名。

如果函數(shù)只需要handler一個參數(shù)迎献,可以省略方法調(diào)用的圓括號:

aaa.sort {
  ...
}

默認值

參數(shù)可以寫默認值瞎访,但是默認值有許多規(guī)矩:

  • 如果使用默認值,調(diào)用的時候忿晕,默認值對應的參數(shù)必須寫參數(shù)名装诡。這里影響的主要是函數(shù)和方法調(diào)用银受,因為類初始化本來就要寫全參數(shù)名。
  • 如果使用默認值并且默認值不是出現(xiàn)在最后鸦采,那調(diào)用的時候必須寫全所有參數(shù)宾巍。

綜合以上兩點,建議大家在使用默認值的時候渔伯,把帶默認值的參數(shù)放在列表結尾顶霞,這樣會方便許多。

強制指定參數(shù)名

如果你想強制要求調(diào)用時必須加參數(shù)名锣吼,可以在聲明的時候給參數(shù)加上外部參數(shù)名:

func test(outName name: String, outAge age: Int) {
  ...
}

test(outName: "asd", outAge: 2)

這樣調(diào)用的時候必須加上對應的外部參數(shù)名选浑。

如果外部參數(shù)名和內(nèi)部參數(shù)名一樣,可以直接在參數(shù)名前加#

func test(#name: String, #age: Int) {
  ...
}

test(outName: "asd", outAge: 2)

強制取消參數(shù)名

對于需要參數(shù)名的函數(shù)玄叠,你也可以在參數(shù)名前加_來強制取消參數(shù)名:

class Test {
  func test(name: String, _ age: Int) {
    ...
  }
}

var test = Test()
test.test("123", 3)

總之

Swift 中的函數(shù)調(diào)用真是個坑古徒。

最后編輯于
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市读恃,隨后出現(xiàn)的幾起案子隧膘,更是在濱河造成了極大的恐慌,老刑警劉巖寺惫,帶你破解...
    沈念sama閱讀 222,183評論 6 516
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件疹吃,死亡現(xiàn)場離奇詭異,居然都是意外死亡西雀,警方通過查閱死者的電腦和手機萨驶,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,850評論 3 399
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來艇肴,“玉大人腔呜,你說我怎么就攤上這事《雇欤” “怎么了育谬?”我有些...
    開封第一講書人閱讀 168,766評論 0 361
  • 文/不壞的土叔 我叫張陵,是天一觀的道長帮哈。 經(jīng)常有香客問我,道長锰镀,這世上最難降的妖魔是什么娘侍? 我笑而不...
    開封第一講書人閱讀 59,854評論 1 299
  • 正文 為了忘掉前任,我火速辦了婚禮泳炉,結果婚禮上憾筏,老公的妹妹穿的比我還像新娘。我一直安慰自己花鹅,他們只是感情好氧腰,可當我...
    茶點故事閱讀 68,871評論 6 398
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般古拴。 火紅的嫁衣襯著肌膚如雪箩帚。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,457評論 1 311
  • 那天黄痪,我揣著相機與錄音紧帕,去河邊找鬼。 笑死桅打,一個胖子當著我的面吹牛是嗜,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播挺尾,決...
    沈念sama閱讀 40,999評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼鹅搪,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了遭铺?” 一聲冷哼從身側響起丽柿,我...
    開封第一講書人閱讀 39,914評論 0 277
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎掂僵,沒想到半個月后航厚,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,465評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡锰蓬,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,543評論 3 342
  • 正文 我和宋清朗相戀三年幔睬,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片芹扭。...
    茶點故事閱讀 40,675評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡麻顶,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出舱卡,到底是詐尸還是另有隱情辅肾,我是刑警寧澤,帶...
    沈念sama閱讀 36,354評論 5 351
  • 正文 年R本政府宣布轮锥,位于F島的核電站矫钓,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏舍杜。R本人自食惡果不足惜新娜,卻給世界環(huán)境...
    茶點故事閱讀 42,029評論 3 335
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望既绩。 院中可真熱鬧概龄,春花似錦、人聲如沸饲握。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,514評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至衰粹,卻和暖如春锣光,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背寄猩。 一陣腳步聲響...
    開封第一講書人閱讀 33,616評論 1 274
  • 我被黑心中介騙來泰國打工嫉晶, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人田篇。 一個月前我還...
    沈念sama閱讀 49,091評論 3 378
  • 正文 我出身青樓替废,卻偏偏與公主長得像,于是被迫代替她去往敵國和親泊柬。 傳聞我的和親對象是個殘疾皇子椎镣,可洞房花燭夜當晚...
    茶點故事閱讀 45,685評論 2 360

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