Swift 可選接口

Objective-C 中的 Protocol 裏存在 @optional 關鍵字,被這個關鍵字修飾的方法並不是必需要被實現。好比最多見的 UITableViewDataSource 和 UITableViewDelegate。可是在 Swift 中的 Protocol 的全部方法都是必須被實現的。那麼咱們怎麼樣才能在 Swift 實現可選接口呢?swift

  • @objc & optional
  • 接口擴展

@objc & optional

@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

優點

  • 直接以 Objective-C 的接口使用方式來使用。

劣勢

  • 使用 @objc 修飾的 Protocol 就只能被 class 實現。對於 struct 和 enum 類型,咱們沒法實現此種方式定義的接口。

接口擴展

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

優點

  • 利用 extension 給出默認實現的接口能夠供 class、struct 及 enum 使用。

劣勢

  • 對於有返回值的接口,默認實現老是須要提供一個合適的返回值,可是並不老是有合適的默認值返回。

例如:spa

protocol MyProtocol {
    func calculateRadian() -> Double
}
複製代碼

這裏的 Protocol 定義的方法返回一個計算出來的弧度,可是這時咱們就很難找到一個合適的默認值去默認實現接口的方法。code


參考

Swifter 100 個 SWift 必備 Tipsorm

相關文章
相關標籤/搜索