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

本文介绍了一种方法,用于确保iOS应用中的UIWebView或WKWebView能正确填充整个屏幕,并针对不同版本的iOS进行适配。

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


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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值