首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Subscripting of NSError

Subscripting of NSError
EN

Stack Overflow用户
提问于 2015-12-17 17:40:46
回答 1查看 731关注 0票数 2

在我的WKWebView委托方法中有以下代码:

代码语言:javascript
复制
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'

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

代码语言:javascript
复制
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中做到这一点?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-12-17 17:46:08

这并不是Swift编译器提供的非常有用的错误消息。它的意思是URLString确实应该是AnyObject?,但是您试图强迫它成为String --这是Swift不允许的,除非您键入它,就像在第二个例子中所做的那样。

因此,第二段代码可以工作,因为您正在从字典中提取键,并在使用它之前安全地确保它是正确的类型。如果你完全相信你不需要那张支票(剧透者:你可能错了,对不起!),那么你可以这样写:

代码语言:javascript
复制
let URLString = error.userInfo[NSURLErrorFailingURLStringErrorKey] as! String

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34340943

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档