在我的WKWebView委托方法中有以下代码:
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)
}不幸的是,它没有编译。我收到一个错误:

Cannot subscript a value of type '[NSObject : AnyObject]' with an index of type 'String'
但是,如果我这样修改它,代码就会编译得很好:
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中做到这一点?
发布于 2015-12-17 17:46:08
这并不是Swift编译器提供的非常有用的错误消息。它的意思是URLString确实应该是AnyObject?,但是您试图强迫它成为String --这是Swift不允许的,除非您键入它,就像在第二个例子中所做的那样。
因此,第二段代码可以工作,因为您正在从字典中提取键,并在使用它之前安全地确保它是正确的类型。如果你完全相信你不需要那张支票(剧透者:你可能错了,对不起!),那么你可以这样写:
let URLString = error.userInfo[NSURLErrorFailingURLStringErrorKey] as! String这比你的第一个解决方案只长了几个字符。注意:显然,我认为这不是一个好主意--您的第二个示例(使用if/let)更好。
https://stackoverflow.com/questions/34340943
复制相似问题