讓不懂程式設計的人愛上iPhone開發系列2 iOS12+Swift4.2版-Checklists-09
說明 :
本系列教程改編自raywenderlich.com中的iOS Apprentice系列,有需要的童鞋請移步到這裡購買英文版原教程: https:// store.raywenderlich.com /products/ios-apprentice
歡迎繼續我們的學習~
在繼續學習新的知識之前,讓我們回過頭來看看程式碼,希望這一次可以真的看懂,而不是總覺得好像隔了一層什麼~
理論充電-有多個引數的方法
在之前的學習中,我們只接觸過帶有單個引數的方法,或者完全沒有引數的方法。但在表檢視資料來源方法中我們碰到了帶兩個引數的方法。

在兩個⽅法中,第⼀個引數都是UITableView物件(觸發這些方法的表檢視),⽽前⼀個方法的第⼆個引數是section 編號,後⼀個方法的第二個引數是所謂的indexPath。
在其它的程式設計語⾔中(⽐如C,C++),帶有多個引數的⽅法通常⽤下面的形式來展⽰:
void numberOfRowsInSection(UITableView *tableView,NSInteger section) { ... }
而在Swift中方法的書寫形式因為要相容iOS框架,所以更像是它的前輩Objective-C語言。以numberOfRowsInSection:為例:
override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { ... }
以上⽅法的官⽅正式命名應該是tableView(_:numberOfRowsInSection:)
如果你大聲讀出來,就會發現這種命名方式是有意義的。該方法的作用就是獲取某個特定表檢視中某個特定section的⾏數量。
第一個引數是這樣的:
_ tableView: UITableView
這個引數的名稱是tableView。它的後面跟著一個冒號,以及引數型別,UITableView。
第二個引數是這樣的:
numberOfRowsInSection section: Int
這裡有兩個名稱,分別是numberOfRowsInSection和section。
當呼叫方法的時候我們會使用第一個名稱numberOfRowsInSection,這是一個外部引數名。在方法內部我們將使用第二個名稱section,也就是本地引數名。而該引數的型別是Int。
當我們不想使用外部引數名的時候,比如_tableView:UITableView這個引數,就可以使用_下劃線,表示我們不希望引數有外部名稱。
因為歷史的原因,很多來自Objective-C的方法的首個引數名稱都使用了_。通過這樣的方式,首個引數只有一個名稱,而其它引數則有兩個名稱。
奇怪嗎?真的很奇怪。難受嗎?真的很難受,:cry:
如果你之前學過Objective-C,或許會習慣這樣的表達方式。但如果你學過其它的程式語言,再看這樣的程式碼真心會覺得嚴重不適~
不過或許等你習慣之後,你會發現這樣的方式其實更有可讀性。
對於學過其它程式語言的童鞋,在看ChecklistViewController.swift程式碼的時候,會誤以為其中包含了三個名為tableView()的方法。
然而事實不是這樣的,事實是,在Swift中,引數名稱也是方法名稱的一部分。所以這三個方法的名稱實際上是:
tableView(_:numberOfRowsInSection:)
tableView(_:cellForRowAt:)
tableView(_:didSelectRowAt:)
好了,現在大家可以說基本上看得懂Swift中的方法了。
不過等等,有兩個方法的後面還有一個非常可怕的->箭頭。如果你有幸學過C語言或者C++語言,那麼對這個->箭頭符號一定心有餘悸,這可是傳聞中讓川普童鞋畏之如虎的神器“指標”啊。當然,開個玩笑,川普童鞋很可能不懂C/C++,不過指標的威名還是令很多初學者膽寒的。
那麼在Swift方法裡面的->箭頭是幹嘛用的呢?
很簡單,它代表的是方法的返回型別。
所以,在tableView(_:numberOfRowsInSection:)這個方法中,會有-> Int在最後,代表返回一個整形變數。
而在tableView(_:cellForRowAt:)方法中,會有-> UITableViewCell在最後,代表返回一個表檢視cell物件。
當然,tableView(_:didSelectRowAt:)方法中沒有這個可怕的符號,代表它只執行操作,並不返回任何值。
看到這裡,我們或許終於可以安心的喝口水壓壓驚了~
不可否認,Swift的方法體程式碼真心有點另類,但是不管怎樣,如果你已經跟隨到了這裡,相比也差不多可以看懂了。
好了,本課的內容就到這裡了。
我們下一課再見~
聯絡方式:
個人微信: iseedo
公眾號:icodefun
答疑說明:
有相關的問題請到課程答疑專區提問 http:// icode.fun/ask/forum.php
福利時間~