2016-07-30 8 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

これは直接質問に答えるものではありませんが、ネットワークの到達可能性ライブラリの使用を検討してください。あなたが考えていない可能性のある他のネットワーク到達可能性の問題を捕捉し、ネットワークが到達可能になったときにバージョンチェックを非同期にトリガするようなことを行うことができます。 ココアポッドには多くのものがあります。多くはブロックベースなので、あなたが書いたようなメソッドを持たずに、成功事例からReachabilityライブラリを渡したブロックの中にコードを移動します。 – divergio

答えて

1

0はあなたのためのエラーを表している場合、あなたが行うことができます:

return Int(contents as String) ?? 0 

??は "ゼロの合体演算子" と呼ばれています。 nilでなければ最初の値を返し、それ以外の場合は2番目の値を返します。

あなたが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)") 'を試して、問題の内容を確認することができます。 –

関連する問題