我在Objective-C中编写了一个关于高度模糊的语言的解析器。一切正常。我经常跳出许多函数调用并抛出异常(我一直在我的代码中,因此异常永远不会离开解析器)。
我想把代码移植到Swift,然后我注意到Swift中没有异常处理。
我不想要异常处理,也不需要它,但跳出许多不同的嵌套函数调用会派上用场,而编写解析器< /强>
有没有一种好方法而不是跳转到Swift中@catch
块的异常?
递归函数示例,使其更清晰(工作游乐场代码):
import Foundation
func addToSum(sum: Int, rest: String) -> Int {
if rest == "" {
return sum
} else {
if rest[rest.endIndex.predecessor()] != "i" {
// can't throw exception, if scratches is like "iiiiiiiiiiiioiiiiii"
}
var shorterRest = rest.substringToIndex(rest.endIndex.predecessor())
return addToSum(sum + 1, shorterRest)
}
}
let scratches = "iiiiiiiiiiiiiiiiiiiii"
var sum = addToSum(0, scratches) // sum is 11 ;-)
我知道这个例子并不是那么好,因为它只是一个函数,你可以很容易地添加一个错误,但后来我不得不回复每个函数。
请查看更大的图片。我不需要在解析器中进行回溯。
Here是一个具有相同问题的链接:在解析器中使用异常作为流控制。不幸的是,它没有给出答案。
答案 0 :(得分:3)
在这种情况下,返回一个Optional很容易处理。不要抛出异常,只需返回nil
并让它传播回链。
func addToSum(sum: Int, rest: String) -> Int? {
if rest == "" {
return sum
} else {
if rest[rest.endIndex.predecessor()] != "i" {
return nil
}
var shorterRest = rest.substringToIndex(rest.endIndex.predecessor())
return addToSum(sum + 1, shorterRest)
}
}
let scratches = "iiiiiiiiiiiiiiiiiiiii"
var sum = addToSum(0, scratches) // sum is 21, actually
sum = addToSum(0, "iiiioiii") // sum is now nil