声明一个独立于Swift 2中特定泛型类型的变量

时间:2015-10-14 08:03:24

标签: ios swift generics swift2

我正在编写一个Web包装器视图控制器,它根据运行它的iOS版本动态使用最合适的Web视图类:

protocol WebViewCommon: class {
    func loadURL(url: NSURL)
    func disableBouncing()
    func haveLoadedPage() -> Bool
}

class WebWrapperViewController<T where T: UIView, T: WebViewCommon>: UIViewController {

    var loginUrl: NSURL!
    var webView: T!

    // ...
}

然后我需要按如下方式实例化正确的通用版本:

    var webWrapperVC: WebWrapperViewController // compiler error

    if #available(iOS 8.0, *) {
        webWrapperVC = WebWrapperViewController<WKWebView>()
    } else {
        webWrapperVC = WebWrapperViewController<UIWebView>()
    }

    webWrapperVC.loginUrl = targetURL // access WebWrapperViewController specific API
    self.window!.rootViewController = webWrapperVC

var声明无法编译,并出现以下错误:

  

引用泛型类型&#39; WebWrapperViewController&#39;要求   &lt; ...&gt;

中的参数

到目前为止,我已经尝试过:

    var webWrapperVC: WebWrapperViewController<UIView<WebViewCommon>>

(导致:&#34;类型&#39; UIView&#39;不符合协议&#39; WebViewCommon&#39;&#34;)

    var webWrapperVC: WebWrapperViewController<T where T: UIView, T: WebViewCommon>

(导致:&#34;预期&#39;&gt;&#39;完成通用参数列表&#34;)

因此,我的问题是:此实例中的var声明是什么?由于我需要访问特定于WebWrapperViewController的API,{{1}声明需要包含此类型。

1 个答案:

答案 0 :(得分:0)

在这种情况下,我认为你不需要使用泛型。您可以使用协议。定义没有泛型的视图控制器,并使用协议作为webView的类型。

class WebWrapperViewController: UIViewController {

    var loginUrl: NSURL?
    var webView: WebViewCommon?

    // ...
}