我正在寫動態使用最合適的web視圖類取決於它在其上運行的IOS版本的web包裝視圖控制器:在夫特聲明特異性通用類型的變量獨立2
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
聲明沒有編制,並出現以下錯誤:
Reference to generic type 'WebWrapperViewController' requires arguments in <...>
到目前爲止,我曾嘗試:
var webWrapperVC: WebWrapperViewController<UIView<WebViewCommon>>
(這會導致 「類型 '的UIView' 不符合協議 'WebViewCommon'」)
和
var webWrapperVC: WebWrapperViewController<T where T: UIView, T: WebViewCommon>
(其結果是:「預期'>'完成通用參數列表」)
我的問題是因此:在這種情況下,正確的var
聲明是什麼?由於我需要訪問特定於WebWrapperViewController
的API,因此var
聲明需要包含此類型。
爲什麼不可選? var webWrapperVC:WebWrapperViewController? – dirtydanee
因爲我正在使用'if-else'語句,變量肯定會被初始化。事實上,甚至有效的Swift在這裏聲明爲「let」。 並聲明爲可選不會導致編譯器錯誤消失。 –