前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >【iOS开发】使用 protocol 与 extension 来限制函数作用域

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

作者头像
KyXu
发布2019-04-11 16:00:56
5180
发布2019-04-11 16:00:56
举报
文章被收录于专栏:KyXuKyXu

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

就会有下面这行代码

代码语言:javascript
复制
webview.frame = UIScreen.mainScreen().bounds

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

代码语言:javascript
复制
func expandView(view:UIView) {
    if view.isKindOfClass(UIWebView) || view.isKindOfClass(WKWebView) {
        view.frame = UIScreen.mainScreen().bounds
    }
}

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

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

代码语言:javascript
复制
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,这使得这个函数不会在其他源文件以其他方式被调用。


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

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2016.03.12 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档