【问题标题】:Swift: Determining if cast to integer from string succeedsSwift:确定从字符串转换为整数是否成功
【发布时间】:2016-07-30 15:42:43
【问题描述】:

下面是我的代码

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 加载,它将返回一个整数。糟糕的 Internet 连接,例如需要在访问 Internet 之前登录的机场,不会返回整数,而是返回请求登录的完整 HTML 页面。使用return Int(contents as String)! 强制向下转换将产生错误fatal error: unexpectedly found nil while unwrapping an Optional value

当我写这篇文章时,我假设这会运行 catch 语句,但它却返回了一个致命错误。我怎么能抓住这个?

【问题讨论】:

  • 这不是直接回答问题,但我建议您考虑使用网络可达性库。它将捕获您可能没有想到的其他网络可访问性问题,并且可以执行诸如在网络确实变得可访问时异步触发您的版本检查之类的事情。 Cocoapods 上有很多。许多都是基于块的,因此您无需使用您编写的方法,而是将代码从成功案例移到您传递可达性库的块内。

标签: swift casting


【解决方案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

【讨论】:

    【解决方案2】:

    那是因为你强制一个可选值是非可选的。

    您必须检查是否可以转换:

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

    【讨论】:

      【解决方案3】:
      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 运行 catch 语句。我不确定为什么?我希望有人可以回答这个问题,否则这个语句可以解决它。

      【讨论】:

      • catch 块内,Swift 给你一个error。你可以试试print("Error: \(error)")看看是什么问题。
      猜你喜欢
      • 2023-03-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多