我在WKWebView委托方法中有这段代码:
import json
with open('foo.txt', 'r') as f:
d = json.load(f)
new_key = 'foo'
if new_key not in d:
d[new_key] = 'bar'
with open('foo.txt', 'w') as f:
json.dump(d, f)
不幸的是,它没有编译。我收到一个错误:
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'
我不喜欢这种解决方案,因为有太多不必要的类型转换。
为什么第二个解决方案有效但第一个解决方案无法编译?在Swift中有更好的方法吗?
答案 0 :(得分:1)
这不是来自Swift编译器的非常有用的错误消息。这意味着URLString
确实应该是AnyObject?
,但是你试图强迫它成为String
- 除非你,否则Swift不会允许如你在第二个例子中那样对它进行类型转换。
因此,第二个代码可以正常工作,因为您在将字符串从字典中拉出并在使用之前安全地确保它是正确的类型。如果你绝对相信你不需要那张支票(剧透:你可能错了,对不起!),那么你可以这样写:
let URLString = error.userInfo[NSURLErrorFailingURLStringErrorKey] as! String
这比你的第一个解决方案只有几个字符。注意:显然我认为这不是一个好主意 - 你的第二个例子(使用if/let
)更好。