我正在编写一个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}声明需要包含此类型。
答案 0 :(得分:0)
在这种情况下,我认为你不需要使用泛型。您可以使用协议。定义没有泛型的视图控制器,并使用协议作为webView的类型。
class WebWrapperViewController: UIViewController {
var loginUrl: NSURL?
var webView: WebViewCommon?
// ...
}