Swift:确定从字符串转换为整数是否成功

4
以下是我的代码
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语句,但实际上它返回了致命错误。如何捕获这个错误?

这并不是直接回答问题,但我建议像这样的问题您考虑使用一个网络可达性库。它将捕获您可能没有想到的其他网络可达性问题,并且可以在网络可达时异步触发您的版本检查等操作。Cocoapods 上有很多这样的库。许多都是基于 block 的,所以您可以将成功情况下的代码从您编写的方法中移动到传递给 Reachability 库的 block 中。 - divergio
3个回答

3
如果对你来说,数字 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

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

catch 块内,Swift 会给你一个 error。你可以尝试使用 print("Error: \(error)") 来查看问题所在。 - Aaron Brager

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接