【发布时间】:2015-10-14 08:03:24
【问题描述】:
我正在编写一个 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 声明无法编译,出现以下错误:
对泛型“WebWrapperViewController”的引用需要 <...>
中的参数
到目前为止我已经尝试过:
var webWrapperVC: WebWrapperViewController<UIView<WebViewCommon>>
(导致:“类型'UIView'不符合协议'WebViewCommon'”)
和
var webWrapperVC: WebWrapperViewController<T where T: UIView, T: WebViewCommon>
(导致:“预期 '>' 完成通用参数列表”)
因此我的问题是:在这种情况下,正确的 var 声明是什么? 因为我需要访问特定于 WebWrapperViewController 的 API,所以 var 声明需要包含这个输入。
【问题讨论】:
-
为什么不可选? var webWrapperVC: WebWrapperViewController?
-
因为我使用的是
if-else语句,所以变量肯定会被初始化。事实上,在这里声明为let甚至是有效的Swift。并且声明为可选不会使编译器错误消失。