Я пишу контроллер представления веб-оболочку, которая динамически использует наиболее подходящий класс просмотра веб-страниц в зависимости от версии прошивкой, на котором она выполняется:Объявите переменную независимо от конкретного общего типа в Swift 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
в этом случае? Поскольку мне нужно получить доступ к API, который относится к WebWrapperViewController
, объявление var
должно включать этот тип.
Почему не является обязательным? var webWrapperVC: WebWrapperViewController? – dirtydanee
Поскольку я использую оператор 'if-else', переменная определенно будет инициализирована. На самом деле, даже Swift объявляет как «пусть» здесь. И объявление как необязательное не приводит к ошибке компилятора. –