2016-07-30 66 views
1

下面是我的代碼斯威夫特:確定是否強制轉換爲整數字符串成功

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) 
    } 
} 

如果URL加載時,它會返回一個整數。一個糟糕的互聯網連接,例如需要在互聯網訪問之前登錄的機場,不會返回一個整數,而是一個請求登錄的完整HTML頁面。用return Int(contents as String)!強制降格會產生錯誤fatal error: unexpectedly found nil while unwrapping an Optional value

我認爲這會在我寫這篇文章時運行catch語句,但是它會返回一個致命錯誤。我怎麼能抓住這個?

+0

這不是直接回答問題,但我建議對於這樣的事情,你考慮使用網絡可達性庫。它會捕獲其他可能無法想到的網絡可達性問題,並且可以在網絡變得可達時執行異步觸發版本檢查等操作。 Cocoapods上有很多。許多是基於塊的,所以不是像你寫的那樣寫一個方法,而是將你的成功案例中的代碼移到你傳遞Reachability庫的塊中。 – divergio

回答

1

如果0代表了你的錯誤,你可以這樣做:

return Int(contents as String) ?? 0 

??被稱爲 「無合併運算符」。如果它不是nil,則返回第一個值,否則返回第二個值。

如果你想要更強大的處理可以使用guard ...

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

return value 
+0

這是一個很棒的答案,非常感謝! –

0

那是因爲你正迫使一個可選的值是無可選擇的。

你必須檢查轉換是可能的:

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) 
    } 
} 

修正錯誤,雖然使得DO /捕獲運行catch語句。我不知道爲什麼?我希望有人能回答這個問題,但否則這個聲明會修正它。

+0

在catch塊中,Swift給你一個'error'。你可以嘗試'print(「Error:\(error)」)來查看問題所在。 –