斯威夫特:确定是否强制转换为整数字符串成功
下面是我的代码斯威夫特:确定是否强制转换为整数字符串成功
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
代表了你的错误,你可以这样做:
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
这是一个很棒的答案,非常感谢! –
那是因为你正迫使一个可选的值是无可选择的。
你必须检查转换是可能的:
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语句。我不知道为什么?我希望有人能回答这个问题,但否则这个声明会修正它。
在catch块中,Swift给你一个'error'。你可以尝试'print(“Error:\(error)”)来查看问题所在。 –
这不是直接回答问题,但我建议对于这样的事情,你考虑使用网络可达性库。它会捕获其他可能无法想到的网络可达性问题,并且可以在网络变得可达时执行异步触发版本检查等操作。 Cocoapods上有很多。许多是基于块的,所以不是像你写的那样写一个方法,而是将你的成功案例中的代码移到你传递Reachability库的块中。 – divergio