Objective-C 中的 Protocol 裏存在 @optional 關鍵字,被這個關鍵字修飾的方法並不是必需要被實現。好比最多見的 UITableViewDataSource 和 UITableViewDelegate。可是在 Swift 中的 Protocol 的全部方法都是必須被實現的。那麼咱們怎麼樣才能在 Swift 實現可選接口呢?swift
@objc protocol MyProtocol {
func doSomething()
@objc optional func doSomething_optional()
}
class MyClass: NSObject, MyProtocol {
func doSomething() {
}
}
/// 編譯不經過
/// Non-class type 'MyStruct' cannot conform to class protocol 'MyProtocol'
struct MyStruct: MyProtocol {
}
複製代碼
原生的 Swift Protocol 裏是沒有可選項的,全部定義的方法都是必須被實現的。若是咱們須要像 Objective-C 裏那樣定義可選的方法,能夠直接將接口自己定義爲 Objective-C 的。bash
extension MyProtocol {
func doSomething_optional() {
print("Default implementing by extension protocol.")
}
}
class MyClass: MyProtocol {
func doSomething() {
// do something
}
}
struct MyStruct: MyProtocol {
func doSomething() {
// do something
}
}
enum MyEnum: MyProtocol {
func doSomething() {
// do something
}
}
複製代碼
雖然 Swift 中定義的 Protocol 的方法都是必須實現的,可是咱們能夠利用 protocol extension 的方式給出部分方法的默認實現。ui
例如:spa
protocol MyProtocol {
func calculateRadian() -> Double
}
複製代碼
這裏的 Protocol 定義的方法返回一個計算出來的弧度,可是這時咱們就很難找到一個合適的默認值去默認實現接口的方法。code