斯威夫特:确定是否强制转换为整数字符串成功

问题描述:

下面是我的代码斯威夫特:确定是否强制转换为整数字符串成功

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

如果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

这是一个很棒的答案,非常感谢! –

那是因为你正迫使一个可选的值是无可选择的。

你必须检查转换是可能的:

if let number = Int(contents as String) { 
    return number 
} 
return -1 // Or something you will recognise as error 

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)”)来查看问题所在。 –