Swift 不考虑泛型类型的可选绑定

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! // ... } …以及尖括号内的一系列其他内容,包括,,。等等。解决这一问题的最佳方法可能是使用一

考虑以下代码段:

通用web包装器视图控制器定义:

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")
}