Objective-C中的protocol里存在@optional關鍵字,被這個關鍵字修飾的方法并非必須要被實現(xiàn)。我們可以通過接口定義一系列方法,然后由實現(xiàn)接口的類選擇性地實現(xiàn)其中幾個方法。在Cocoa API中很多情況下接口方法都是可選的,這點和Swift中的protocol的所有方法都必須被實現(xiàn)這一特性完全不同。
那些如果沒有實現(xiàn)則接口就無法正常工作的方法一般是必須的,而相對地像作為事件通知或者對非關鍵屬性進行配置的方法一般都是可選的。最好的例子我想應該是UITableViewDataSource和UITableViewDelegate。前者中有兩個必要方法:
-tableView:numberOfRowsInSection: -tableView:cellForRowAtIndexPath:
分別用來計算和準備tableView的高度以及提供每一個cell的樣式,而其他的像是返回section個數(shù)或者詢問 cell 是否能被編輯的方法都有默認的行為,都是可選方法;后者(UITableViewDelegate)中的所有方法都是詳細的配置和事件回傳,因此全部都是可選的。
原生的Swift protocol里沒有可選項,所有定義的方法都是必須實現(xiàn)的。如果我們想要像Objective-C里那樣定義可選的接口方法,就需要將接口本身定義為Objective-C的,也即在protocol定義之前加上@objc。另外和Objective-C中的@optional不同,我們使用沒有@符號的關鍵字optional來定義可選方法:
@objc protocol OptionalProtocol { optional func optionalMethod() }另外,對于所有的聲明,它們的前綴修飾是完全分開的。也就是說你不能像是在Objective-C里那樣用一個@optional指定接下來的若干個方法都是可選的了,必須對每一個可選方法添加前綴,對于沒有前綴的方法來說,它們是默認必須實現(xiàn)的:
@objc protocol OptionalProtocol { optional func optionalMethod() // 可選 func necessaryMethod() // 必須 optional func anotherOptionalMethod() // 可選 }一個不可避免的限制是,使用@objc修飾的protocol就只能被class實現(xiàn)了,也就是說,對于struct和enum類型,我們是無法令它們所實現(xiàn)的接口中含有可選方法或者屬性的。
作者:王?。?a target="_blank">@onevcat),iOS和Unity3D開發(fā)者
本文轉(zhuǎn)載自:Swifter