首页 > 解决方案 > 快速为系统协议可选要求进行通用实现的最简单方法是什么?

问题描述

这是系统协议和可选要求。

public protocol WKNavigationDelegate : NSObjectProtocol {

    @available(iOS 8.0, *)
    optional func webView(_ webView: WKWebView, decidePolicyFor navigationAction: WKNavigationAction, decisionHandler: @escaping (WKNavigationActionPolicy) -> Void)
}

假设有多个 ViewController 需要实现此协议。

class ViewController1: UIViewController, WKNavigationDelegate { } // default
class ViewController2: UIViewController, WKNavigationDelegate { } // default

class ViewController3: UIViewController, WKNavigationDelegate { 

    func webView(_ webView: WKWebView, decidePolicyFor navigationAction: WKNavigationAction, decisionHandler: @escaping (WKNavigationActionPolicy) -> Void) {
        print("Override Success!")
    }
}

如果它没有在 ViewControllers 中实现,就像我们对自定义协议一样,有没有一种方法可以为这个协议提供默认实现。

extension WKNavigationDelegate {

    func webView(_ webView: WKWebView, decidePolicyFor navigationAction: WKNavigationAction, decisionHandler: @escaping (WKNavigationActionPolicy) -> Void) {
        print("Success!") // default implementation doesn't seem to work for system protocol
    }
}

标签: swiftprotocols

解决方案


您可以扩展基类并使用默认实现UIViewController使其符合系统协议WKNavigationDelegate

extension UIViewController : WKNavigationDelegate  {

    func webView(_ webView: WKWebView, decidePolicyFor navigationAction: WKNavigationAction, decisionHandler: @escaping (WKNavigationActionPolicy) -> Void) {
        print("Success!")
    }
}

并在子类中覆盖它


推荐阅读