【问题标题】:Declare a variable independent of specific generic type in Swift 2在 Swift 2 中声明一个独立于特定泛型类型的变量
【发布时间】: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。并且声明为可选不会使编译器错误消失。

标签: ios swift generics swift2


【解决方案1】:

我认为在这种情况下您不需要使用泛型。您可以使用一个协议。定义不带泛型的视图控制器,并使用协议作为 webView 的类型。

class WebWrapperViewController: UIViewController {

    var loginUrl: NSURL?
    var webView: WebViewCommon?

    // ...
}

【讨论】:

  • 然后我得到这个编译器错误:'WebWrapperViewController' 要求 'WebViewCommon' 继承自 'UIView',这就是为什么我也尝试了var webWrapperVC: WebWrapperViewController&lt;UIView&lt;WebViewCommon&gt;&gt;
  • 如果这是在WebWrapperViewController 那么:var webWrapperVC: WebWrapperViewController&lt;T&gt;
  • 抱歉 - 这是在 UIApplicationDelegate 子类中。我尝试将构造哪个泛型版本的逻辑移动到 WebWrapperViewController 中的静态工厂方法,但在该函数的返回类型上遇到了完全相同的问题,WebWrapperViewController&lt;T&gt; 没有涵盖它。
猜你喜欢
  • 2018-02-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-09-28
  • 1970-01-01
  • 2020-01-15
  • 2013-04-02
  • 1970-01-01
相关资源
最近更新 更多