2016-07-30 9 views
1

Unten ist mein CodeSwift: Feststellen, ob Guss auf ganze Zahl von String gelingt

func contactForUpdates() -> Int { 
    //contact server for most recent version 
    let versionURL = settings.versionURL 

    if let url = URL(string: versionURL) { 
     do { 
      let contents = try NSString(contentsOf: url, usedEncoding: nil) 
//NEXT LINE IS WHERE THE QUESTIONS LIES 
      return Int(contents as String)! 
     } catch { 
      // contents could not be loaded 
      processError("Current version could not be loaded.") 
      return Int(0) 
     } 
    } else { 
     // the URL was bad! 
     processError("Current version could not be loaded--URL was bad.") 
     return Int(0) 
    } 
} 

Wenn die URL geladen wird, wird es eine einzige ganze Zahl zurück. Eine schlechte Internetverbindung, z. B. ein Flughafen, der vor dem Internetzugang eine Anmeldung erfordert, gibt keine ganze Zahl zurück, sondern eine vollständige HTML-Seite, die eine Anmeldung anfordert. Erzwingen eines Downcast mit return Int(contents as String)! wird den Fehler fatal error: unexpectedly found nil while unwrapping an Optional value produzieren.

Ich nahm an, dass dies die catch-Anweisung ausführen würde, wenn ich dies schrieb, aber stattdessen gibt es einen schwerwiegenden Fehler zurück. Wie kann ich das fangen?

+0

Dies beantwortet nicht direkt die Frage, aber ich empfehle für so etwas wie Sie eine Netzwerk-Reachability-Bibliothek verwenden. Es fängt andere Netzwerkerreichbarkeitsprobleme ein, an die Sie vielleicht nicht gedacht haben, und kann Dinge wie die Versionsüberprüfung asynchron auslösen, wenn das Netzwerk erreichbar wird. Es gibt viele auf Cocoapods. Viele sind blockbasiert. Anstatt eine Methode wie die von Ihnen geschrieben zu haben, verschieben Sie den Code von Ihrem Erfolgsfall in den Block, an dem Sie die Erreichbarkeitsbibliothek übergeben. – divergio

Antwort

1

Wenn 0 für Sie einen Fehler darstellt, könnten Sie tun:

return Int(contents as String) ?? 0 

?? ist die "Null-Coalescer-Operator" genannt. Es gibt den ersten Wert zurück, wenn es nicht nil ist, andernfalls gibt es den zweiten Wert zurück.

Wenn Sie robustere wollen Handling Sie guard verwenden könnte ...

guard let value = Int(contents as String) else { 
    processError("Something went horribly wrong") 
    return 0 
} 

return value 
+0

Das war eine fantastische Antwort, vielen Dank! –

0

Das ist, weil Sie einen optionalen Wert zwingen nicht optional zu sein.

Sie müssen prüfen, ob die Umwandlung möglich ist:

if let number = Int(contents as String) { 
    return number 
} 
return -1 // Or something you will recognise as error 
0
func contactForUpdates() -> Int { 
    //contact server for most recent version 
    let versionURL = settings.versionURL 

    if let url = URL(string: versionURL) { 
     do { 
      let contents = try NSString(contentsOf: url, usedEncoding: nil) 
      if let vers = Int(contents as String) { 
       return vers 
      } 
      else { 
       processError("Current version could not be loaded--Possibly proxy interception") 
       return Int(0) 
      } 
      //return Int(contents as String)! 
     } catch { 
      // contents could not be loaded 
      processError("Current version could not be loaded.") 
      return Int(0) 
     } 
    } else { 
     // the URL was bad! 
     processError("Current version could not be loaded--URL was bad.") 
     return Int(0) 
    } 
} 

behebt die Fehler, obwohl die do macht/catch die catch-Anweisung auszuführen. Ich bin mir nicht sicher warum? Ich hoffe, dass jemand das beantworten kann, aber ansonsten behebt diese Aussage es.

+0

Innerhalb des "catch" -Blocks gibt Swift einen 'Fehler'. Sie können 'print (" Fehler: \ (Fehler) ")' versuchen, um zu sehen, was das Problem ist. –