swift - 快速为系统协议可选要求进行通用实现的最简单方法是什么?
问题描述
这是系统协议和可选要求。
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
}
}
解决方案
您可以扩展基类并使用默认实现UIViewController
使其符合系统协议WKNavigationDelegate
extension UIViewController : WKNavigationDelegate {
func webView(_ webView: WKWebView, decidePolicyFor navigationAction: WKNavigationAction, decisionHandler: @escaping (WKNavigationActionPolicy) -> Void) {
print("Success!")
}
}
并在子类中覆盖它
推荐阅读
- selenium - 爪哇。只要它找到它,我怎么能让它点击?
- html - 如何创建一个固定页脚,其中主要内容可见,额外内容隐藏在下面,仅在使用 css 滚动到底部后可见
- javascript - Chart.js 与 getjson
- c# - Unity - 将 NavMeshAgent 与 Animator 配对
- python - 使用python标记数据框中的特定连续值
- android - 在 React Native 中使用 HeadlessJs 的 Android 网络作业
- webpack - 升级到 vue-loader v15 时,您可能需要合适的加载器
- tfs - 将 TFS CI Build def 移动到 VSTS - VSTS CI build def 获取一切并构建一切
- oracle-apex-5.1 - 页面项目上的 Oracle APEX 过滤器查询
- javascript - iframe 如何访问单独域上的 cookie