【iOS开发】使用 protocol 与 extension 来限制函数作用域

今天碰到这样一个场景,我需要一个仅仅用来展示网页的页面,那么在 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,这使得这个函数不会在其他源文件以其他方式被调用。


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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Swift版本点击这里欢迎加入QQ群交流: 594119878最新更新日期:18-09-17 About A cu...
    ylgwhyh阅读 25,617评论 7 249
  • 发现 关注 消息 iOS 第三方库、插件、知名博客总结 作者大灰狼的小绵羊哥哥关注 2017.06.26 09:4...
    肇东周阅读 12,269评论 4 61
  • 今天是周二,下午学校没有课,我又去A+教育上英语课了。到英语班上,刘美彤送给我一本恐龙的书,上课前我看了看...
    大润帅哥阅读 380评论 0 1
  • 爱美之心人皆有之!我虽是粗俗之人、懒散之人,却也爱花。前几日获得这捧娇艳的红玫瑰,心喜不已!一回家就将它装入水瓶中。
    78_闲云阅读 294评论 0 0
  • 今天初一,新年第一天,上午去附近的古徳寺供灯一盏,祈愿明灯照亮世间无明愚痴黑暗,愿心中明灯指引,不迷茫、不惧进去与...
    谷应阅读 384评论 0 0