如果我們有其他語(yǔ)言的編程經(jīng)驗(yàn)说莫,但是沒有使用過外部參數(shù),看到swift的用法應(yīng)該會(huì)感覺有些奇特的膝蜈,我們首先看看什么是本地參數(shù),什么是外部參數(shù)熔掺。
1饱搏、什么是本地參數(shù)
func calArea(radius: Double,pi: Double) -> Double {
let area = radius * radius * pi
return area
}
當(dāng)我們?cè)诙x函數(shù)calArea的時(shí)候,我們?cè)趨?shù)列表里面定義了參數(shù) radius與pi置逻,然后我們便可以在方法體內(nèi)部使用這兩參數(shù)了推沸,這個(gè)時(shí)候,radius券坞,pi就是本地參數(shù)(在本地使用的意思)鬓催。
2、什么是外部參數(shù)
var area = calArea(3.14,pi: 3.14)
當(dāng)我們調(diào)用函數(shù)calArea的時(shí)候恨锚,我們給第二個(gè)參數(shù)指定了參數(shù)名稱pi宇驾,這個(gè)時(shí)候pi就是外部參數(shù)(當(dāng)外部調(diào)用的時(shí)候使用的名字)
是不是更疑惑了?pi到底是內(nèi)部參數(shù)還是外部參數(shù)猴伶?其實(shí)這個(gè)時(shí)候內(nèi)部參數(shù)和外部參數(shù)恰巧同名了课舍,如果我們?cè)诙x函數(shù)的時(shí)候沒有同時(shí)明確的指出外部參數(shù)和內(nèi)部參數(shù),那么swift會(huì)認(rèn)為他挎,內(nèi)部參數(shù)與外部參數(shù)同名筝尾,此時(shí)swift是這樣看待函數(shù)calArea的。
func calArea(radius: Double,pi pi: Double) -> Double {
let area = radius * radius * pi
return area
}
這一次calArea的pi參數(shù)被指定了兩次办桨,第一次指定的是外部參數(shù)筹淫,第二次指定的是內(nèi)部參數(shù),如果我們沒有指定外部參數(shù)崔挖,那么swift會(huì)自動(dòng)認(rèn)為外部參數(shù)與內(nèi)部參數(shù)同名贸街。當(dāng)然我們可以為它們分別指定名稱。
func calArea(radius: Double,external_pi pi: Double) -> Double {
let area = radius * radius * pi
return area
}
這次我們把第二個(gè)參數(shù)的外部名稱定義為external_pi狸相,那么我們調(diào)用calArea的時(shí)候薛匪,就應(yīng)該這樣了
var area = calArea(3.14,external_pi: 3.14)
3、為什么需要外部參數(shù)
如果沒有外部參數(shù)的幫助,如果我們讀到這樣的代碼,
var area = calArea(3.14,3.14)
甚至是這樣的
var rect = CGRect(10,10,10,10)
我們會(huì)不會(huì)很困惑脓鹃?在外部參數(shù)的幫助下逸尖,代碼的可讀性會(huì)有效的地提高。
var area = calArea(3.14,external_pi: 3.14)
var rect = CGRect(x:10,y:10,width:10,heigth:10)
我們加入外部參數(shù)之后,函數(shù)調(diào)用的參數(shù)意義就非常直觀的體現(xiàn)出來了娇跟,代碼的可讀性直接影響著代碼的可維護(hù)性岩齿,所以我們應(yīng)該使用外部參數(shù)來提高代碼的可讀性。
如果我們確實(shí)不需要外部參數(shù)苞俘,那么我們可以這樣定義函數(shù)盹沈,讓編譯器來忽略掉外部參數(shù)。
func calArea(radius: Double,_ pi: Double) -> Double {
let area = radius * radius * pi
return area
}
我們可以在外部參數(shù)的位置上 加一條下劃線_,下劃線我們?cè)谡f模式匹配的時(shí)候就見過它了吃谣,它表示:忽略它乞封。這時(shí)候我們調(diào)用calArea的時(shí)候就不需要為第二個(gè)參數(shù)指定外部參數(shù)了。
var area = calArea(3.14,3.14)
當(dāng)然岗憋,除非你有非常充分的理由不使用外部參數(shù)肃晚,不然最好還是帶上它吧。
4仔戈、第一個(gè)參數(shù)為啥在調(diào)用的時(shí)候沒有指定外部參數(shù)关串?
在我們沒有顯示的用下劃線忽略外部參數(shù)的情況下,swift要求监徘,在函數(shù)調(diào)用時(shí)晋修,從第二個(gè)參數(shù)開始,必須要使用外部參數(shù)凰盔。swift默認(rèn)是忽略掉第一個(gè)參數(shù)的外部參數(shù)的飞蚓。
注 從swift3開始,第一個(gè)參數(shù)的特殊待遇就會(huì)被取消了廊蜒,就是說swift3以后函數(shù)調(diào)用時(shí),每個(gè)參數(shù)都需要外部參數(shù)溅漾。
swift特殊對(duì)待了第一個(gè)參數(shù)山叮,很重要的原因是兼容oc,oc推薦函數(shù)應(yīng)該像這樣命名
var person = findByName("xiaoming")
findByName這樣的命名方式添履,已經(jīng)把第一個(gè)參數(shù)的意義囊括進(jìn)來了屁倔,如果我們?cè)谡{(diào)用的時(shí)候,再次指明外部參數(shù)的話暮胧,就顯得啰嗦了锐借。
var person = findByName(name: "xiaoming")
因?yàn)閛c推薦我們使用這樣的命名方式,所以它默認(rèn)的忽略了第一個(gè)參數(shù)的外部參數(shù)往衷。當(dāng)然钞翔,從swift開始,這一切都將過去了席舍。以后所有的參數(shù)都將受到平等的對(duì)待了布轿。