gpt4 book ai didi

swift - 订阅 NSError 的 userInfo

转载 作者:可可西里 更新时间:2023-11-01 02:18:18 27 4
gpt4 key购买 nike

我的 WKWebView 委托(delegate)方法中有这段代码:

func webView(webView: WKWebView, didFailProvisionalNavigation navigation: WKNavigation!, withError error: NSError) {
var URL: NSURL? = webView.URL
if URL == nil {
let URLString: String = error.userInfo[NSURLErrorFailingURLStringErrorKey]
URL = NSURL(string: URLString)
}
print(URL)
}

不幸的是,它无法编译。我得到一个错误:

无法使用“String”类型的索引下标“[NSObject : AnyObject]”类型的值

但是,如果我这样更改它,代码编译得很好:

func webView(webView: WKWebView, didFailProvisionalNavigation navigation: WKNavigation!, withError error: NSError) {
var URL: NSURL? = webView.URL
if URL == nil {
if let urlString = error.userInfo[NSURLErrorFailingURLStringErrorKey] as? NSString {
URL = NSURL(string: urlString as String)
}
}
print(URL)
}

我不喜欢这个解决方案,因为有太多不必要的类型转换。

为什么第二个解决方案有效但第一个无法编译?在 Swift 中有没有更好的方法来做到这一点?

最佳答案

这不是来自 Swift 编译器的非常有用的错误消息。它的意思是 URLString 真的应该是 AnyObject?,但你试图强制它成为一个 String – Swift除非您像在第二个示例中那样对其进行类型转换,否则将不允许。

因此,第二个代码有效,因为您从字典中提取 key 并在使用前安全地确保它的类型正确。如果您完全相信您不需要那张支票(剧透:您可能错了,抱歉!),那么您可以这样写:

let URLString = error.userInfo[NSURLErrorFailingURLStringErrorKey] as! String

这只比您的第一个解决方案长几个字符。注意:显然我认为这不是一个好主意——你的第二个例子(使用 if/let)更好。

关于swift - 订阅 NSError 的 userInfo,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34340943/

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