gpt4 book ai didi

swift - 可选绑定(bind),与泛型类型无关

转载 作者:行者123 更新时间:2023-11-30 13:59:52 25 4
gpt4 key购买 nike

考虑以下代码片段:

通用 Web 包装 View Controller 定义:

class WebWrapperViewController<T where T: UIView, T: WebViewCommon>: UIViewController, UIWebViewDelegate, WKNavigationDelegate {

var loginUrl: NSURL!
var webView: T!
// ...
}

AppDelegate 中的代码:

var webWrapperVC: UIViewController

if #available(iOS 8.0, *) {
webWrapperVC = WebWrapperViewController<WKWebView>()
} else {
webWrapperVC = WebWrapperViewController<UIWebView>()
}

if let wvc = webWrapperVC as? WebWrapperViewController { // compiler error
// don't care what generic type of WebWrapperViewController was created in here
wvc.loginUrl = NSURL(string: "https://foo")
}

我在可选绑定(bind)上收到以下编译器错误:

Argument for generic parameter 'T' could not be inferred

我不关心 WebWrapperViewController 的通用版本是什么类型已经创建了,所以我不想让 Actor 阵容变得更具体。

有人知道如何将通配符强制转换为任何泛型类型吗?

我已经尝试过:

if let wvc = webWrapperVC as? WebWrapperViewController<AnyObject>

...以及尖括号内的一堆其他内容,包括 <UIView> , <*> , <T> 。等等

最佳答案

解决此问题的最佳方法可能是使用所有 UIViews 都符合的协议(protocol),而不是通用类,因为不完全支持使用泛型进行强制转换:

protocol UIViewType {
var view: UIView { get }
}

extension UIView: UIViewType {
var view: UIView { return self }
}

// the variable
var webView: protocol<UIViewType, WebViewCommon>

使用 view 属性访问 UIView 特定功能。

另一种方法是创建一个可失败的初始值设定项,该初始值设定项采用 WebWrapperViewController 并在无法转换泛型类型时失败:

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

关于swift - 可选绑定(bind),与泛型类型无关,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33130724/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com