[APP開發-使用Swift] 觀念介紹: Protocols

Chiwen Lai
6 min readSep 26, 2017

--

Protocols是什麼?協定!…什麼是協定?呃…

上一篇:5. UITableView 我們非常容易地製作好了一個簡單的空白表格,接下來我們來看看Swift幫我們做了什麼。

在Xcode按住Option鍵,將游標移動到UITableViewController出現問號後點一下,彈出內建的文件,我們發現,其實UITableViewController是繼承了UIViewController,並且套用了UITableViewDelegate、UITableViewDataSource這兩個Protocols。接下來讓我們來看看什麼是Protocols。

”A protocol defines a blueprint of methods, properties, and other requirements that suit a particular task or piece of functionality.” -Apple

Methods 以及 Properties!

大聯盟投手協定 MLB Pitcher Protocol

先從一個小故事開始。假設有一天,在看完王建民上大聯盟的勵志故事之後,你突然也想成為大聯盟投手,光耀門楣,於是你寫了一封信給大聯盟,詢問要如何成為一位大聯盟投手?

很快地,大聯盟回信了。讓我們從Properties開始:

“it only specifies the required property name and type. The protocol also specifies whether each property must be gettable or gettable and settable.” -Apple

首先你需要一個名字,讓人記住你是誰,你還可以幫自己取一個暱稱,更容易讓人記住你,沒有也沒關係。

接著是Methods,也就是要當一名大聯盟投手你必須要會的事情:

“These methods are written as part of the protocol’s definition in exactly the same way as for normal instance and type methods, but without curly braces or a method body.” -Apple

要知道,成為一名大聯盟投手不是單會投球就好,會的球種要多,最基本的是一定要(Required)可以投快速球(Fastball)以及變速球(Change-up)交替運用。另外,如果社交能力(Social Skills)好,受球迷歡迎,也能為球團帶來不少粉絲,相信更容易受到青睞,當然這不是必要條件(Optional)。

我想現在你應該知道我們的大聯盟投手協定是怎麼回事了吧?接下來讓我們一步步制定我們的大聯盟投手協定。

定義我們的大聯盟投手協定

  1. 定義協定名稱
protocol MLBPitcher {}

2. 加上Properties

protocol MLBPitcher {    var name: String { get }
var nickname: String? { get set }
}

3. 再加上Required Methods

protocol MLBPitcher {    var name: String { get }
var nickname: String? { get set }
func fastBall()
func changeUp()
}

4. 最後加上Optional非必要條件的社交能力要求

@objc protocol MLBPitcher {    var name: String { get }
var nickname: String? { get set }
func fastBall()
func changeUp()
@objc optional func socialSkills()}

Protocols僅定義需要的條件(what),其他的由遵循(Conform)這個Protocol的Class、Structure、Enumeration實作(how)。例如func fastBall()僅定義需要投快速球的能力,但這個function 沒有body實作投快速球的內容,如官方文件所說”without curly braces or a method body”。

以下我們宣告ChienMingWang class遵循MLBPitcher protocol為範例。

class ChienMingWang: MLBPitcher {
var name: String = "王建民"
var nickname: String? = "建仔"
func fastBall() {
print("I can throw four-seam fastball up to 95 mph.")
}
func changeUp() {
print("The sinker is my signature pitch.")
}
}

使用Protocol最大的好處是你不會忘記你所需要的東西,例如一旦你宣告遵循了MLBPitcher就必須要定義fastBall、changeUp這兩個required function的內容,否則會出現錯誤。

回到我們的專案上,當我們查詢UITableViewDataSource Protocol文件時,可以發現其中有2個function是必須要宣告的:cellForRowAt、numberOfRowsInSection。

當我們宣告:

class RestaurantTableViewController: UITableViewController {}

RestaurantTableViewController就必須要“遵循”UITableViewDataSource、UITableViewDelegate的規範,實作cellForRowAt、numberOfRowsInSection內容。至於UITableViewDelegate Protocol,則是均為optional methods。

下一篇:觀念介紹:Delegation

--

--