美文网首页程序员IOS开发iOS Developer
【iOS开发】使用 protocol 与 extension 来

【iOS开发】使用 protocol 与 extension 来

作者: KyXu | 来源:发表于2016-03-12 17:30 被阅读617次

    今天碰到这样一个场景,我需要一个仅仅用来展示网页的页面,那么在 iOS 9 中,我可以使用 SFSafariViewController,而在 iOS 8 及之前版本中,我会使用一个 WebView 来占据整个视图空间,来做这件事。

    就会有下面这行代码

    webview.frame = UIScreen.mainScreen().bounds
    

    进一步地,我想把这个步骤封装为一个函数,因为比如这个页面屏幕旋转时,或者在其他页面,我都可能需要用到它。

    func expandView(view:UIView) {
        if view.isKindOfClass(UIWebView) || view.isKindOfClass(WKWebView) {
            view.frame = UIScreen.mainScreen().bounds
        }
    }
    

    这段代码是说,我们现在可以把 UIWebView 和 WKWebView 都扩展到最大了,其他 UIView 被传入的时候,不会有任何意义。但这不是我想要的,我希望其他 UIView 根本无法调用这个函数,以免产生误解。

    于是我写了下面这段代码:

    protocol ExpandableView {
        func expandToFullView()
    }
    
    private func expand(view:UIView) {
        view.frame = UIScreen.mainScreen().bounds
    }
    
    extension WKWebView: ExpandableView {
        func expandToFullView() { expand(self) }
    }
    
    extension UIWebView: ExpandableView {
        func expandToFullView() { expand(self) }
    }
    

    现在,UIWebView 和 WKWebView 都可以通过 ExpandableView 这个协议,来使用我们定义好的(具有扩展一个 View 到整个界面大小这层意义的) expandToFullView 这个函数,而且因为这个函数的实现实际上是 expand 这个函数,所以他们表现起来是一样的。与此同时,expand 这个函数本身被声明为了 private,这使得这个函数不会在其他源文件以其他方式被调用。


    这段代码被应用在了 这个项目这个文件

    相关文章

      网友评论

        本文标题:【iOS开发】使用 protocol 与 extension 来

        本文链接:https://www.haomeiwen.com/subject/pjmxlttx.html