Swift 不考虑泛型类型的可选绑定
考虑以下代码段: 通用web包装器视图控制器定义:Swift 不考虑泛型类型的可选绑定,swift,generics,swift2,optional,Swift,Generics,Swift2,Optional,考虑以下代码段: 通用web包装器视图控制器定义: class WebWrapperViewController<T where T: UIView, T: WebViewCommon>: UIViewController, UIWebViewDelegate, WKNavigationDelegate { var loginUrl: NSURL! var webView: T! // ... } …以及尖括号内的一系列其他内容,包括,,。等等。解决这一问题的最佳方法可能是使用一
class WebWrapperViewController<T where T: UIView, T: WebViewCommon>: UIViewController, UIWebViewDelegate, WKNavigationDelegate {
var loginUrl: NSURL!
var webView: T!
// ...
}
…以及尖括号内的一系列其他内容,包括
,
,
。等等。解决这一问题的最佳方法可能是使用一个协议,其中所有UIView
都符合该协议,而不是通用类,因为不完全支持使用泛型强制转换:
protocol UIViewType {
var view: UIView { get }
}
extension UIView: UIViewType {
var view: UIView { return self }
}
// the variable
var webView: protocol<UIViewType, WebViewCommon>
if let wvc = webWrapperVC as? WebWrapperViewController<AnyObject>
protocol UIViewType {
var view: UIView { get }
}
extension UIView: UIViewType {
var view: UIView { return self }
}
// the variable
var webView: protocol<UIViewType, WebViewCommon>
class WebWrapperViewController<T where T: UIView, T: WebViewCommon>: UIViewController, UIWebViewDelegate, WKNavigationDelegate {
var loginUrl: NSURL!
var webView: T!
init?<U>(wwvc: WebWrapperViewController<U>) {
// assign all variables
if let webView = wwvc.webView as? T {
self.webView = webView
} else {
return nil
}
loginUrl = wwvc.loginUrl
}
}
// Now you can use it like this
if let wvc = WebWrapperViewController<AnyObject>(wwvc: webWrapperVC) {
wvc.loginUrl = NSURL(string: "https://foo")
}