在C#或Java中,通常解析数字字符串会引发格式异常。但是,以下代码未捕获错误。有什么问题?
func getInt(_ data:String)->Int
{
do
{
return try Int(data)!
}
catch
{
return -1;
}
}
var a = "x123"
var b:Int = getInt(a)
print("Result: " + b)
答案 0 :(得分:4)
你的方法完全错了。 Int初始化器返回一个可选的Int,所以这里是你如何使用它:
if let converted = Int (data) {
// Yes, it was converted
} else {
// No, conversion failed.
}
或者
guard let converted = Int (data) else {
// Conversion failed
return
}
// Continue using "converted".
try不会捕获任何异常,因为不会抛出任何异常。 Int(data)返回一个可选的Int,换句话说,返回Int或nil。它永远不会抛出。抓住没有例外。拥有一个函数getInt只能执行Int()所做的只是添加完全不必要的复杂性。创建抛出异常的函数getInt更糟糕。
答案 1 :(得分:2)
不要明确展开Int(data)!
,而是使用有利于您的nil
:
func getInt(_ data: String) -> Int {
return Int(data) ?? -1
}
顺便说一下,在更为宏大的计划中,存在选项,这样你就不必使用"魔术数字"例如-1表示缺失值。如果可能,重写调用此方法的代码,以便在无法解析字符串时接受nil
值。
答案 2 :(得分:1)
在Swift中,只有throw
可catch
的方法。 Int
初始值设定项不会throw
Swift模式是选项
func getInt(_ data:String) -> Int?
{
return Int(data)
}
let a = "x123"
if let b = getInt(a) {
print("Result: \(b)")
} else {
print("No result")
}
或者您可以返回非可选项并使用nil合并运算符处理可选的错误
func getInt(_ data:String) -> Int
{
return Int(data) ?? -1
}
let a = "x123"
let b = getInt(a)
print("Result: \(b)")
或制作方法can throw
enum MyError : Error {
case conversionError
}
func getInt(_ data:String) throws -> Int
{
guard let result = Int(data) else { throw MyError.conversionError }
return result
}
let a = "x123"
do {
let b = try getInt(a)
print("Result: \(b)")
} catch MyError.conversionError {
print("Could not convert the string '\(a)' to integer")
}
中有关选项的部分