变量(枚举?)在Swift 2

时间:2015-10-12 08:24:25

标签: swift enums

UIViewController子类中需要声明一个名为webView的变量,该变量可以是UIWebViewWKWebView类型(取决于iOS版本)。

有没有更好的方法(可能使用枚举?)而不是其中一个选项:

  1. 声明类型UIView的变量,然后每次需要访问时有条件地转换为两种类型
  2. 不在公共父UIViewController超类中声明变量,而是在两个特定的UIViewController子类中声明特定类型的变量两次?感觉它违反了“不要重复自己”/ DRY原则。

2 个答案:

答案 0 :(得分:3)

您可以定义一个协议,其中包含您要在视图上调用的常用方法:

protocol MyWebView {
    // ...
}

然后使UIWebViewWKWebView符合该协议 (通过扩展名):

extension UIWebView : MyWebView {

}

@available(iOS 8.0, *)
extension WKWebView : MyWebView {

}

现在您可以将实例变量声明为

var webView : MyWebView!

并根据iOS版本进行初始化:

if #available(iOS 8, *){
    webView = WKWebView()
} else {
    webView = UIWebView()
}

答案 1 :(得分:0)

我在我的应用程序中遇到了类似的问题,使用了不同的弃用框架。这个解决方案对我有用:

创建如下所示的属性:

var webView: AnyObject!

viewDidLoad中,使用以下代码初始化网络视图:

if #available(iOS 9, *){
    webView = WKWebView()
} else {
    webView = UIWebView()
}

在您的代码中,当您需要对此Web视图执行某些操作时,您需要执行类似的操作:

if #available(iOS 9, *){
    let newWebView = webView as! WKWebView
    // use newWebView
} else {
    let oldWebView = webView as! UIWebView
    // use oldWebView
}

注意:Martin R建议使用类型别名也可以,但我已经测试了这个解决方案。