2015-12-17 3 views
2

У меня есть этот кусок кода в моей WKWebView метод делегата:индексацию USERINFO из NSError

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?

ответ

1

Это не очень полезное сообщение об ошибке от компилятора Swift. Это значит, что URLString действительно должен быть AnyObject?, но вы пытаетесь заставить его быть String - то, что Swift не позволит, если вы не придумаете его, как вы это делаете в своем втором примере.

Итак, второй код работает, потому что вы вытаскиваете ключ из словаря и надежно гарантируете, что он правильный тип перед его использованием. Если вы абсолютно уверены, что Вам не нужно, что чек (спойлер: вы, вероятно, не так, извините), то вы можете написать это:

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

Вот только несколько символов длиннее первого решения , Примечание: я думаю, что это не очень хорошая идея - ваш второй пример (с использованием if/let) лучше.

+0

Спасибо. Я был озадачен сообщениями об ошибках компилятора раньше, но еще не понял мой урок. –

+0

Это то, над чем агрессивно работает Apple. каждый выпуск Xcode становится лучше. Но да, это еще не совсем! – TwoStraws

Смежные вопросы