我用 Objective-C 编写了一个关于高度模糊语言的解析器。一切正常。我经常跳出许多抛出异常的函数调用(我一直在我的代码中,所以异常永远不会从解析器中消失)。
我想到将代码移植到 Swift 中,然后我发现 Swift 中没有异常处理。
我不想也不需要异常处理,但是跳出许多不同的嵌套函数调用在编写解析器.
在Swift中,有什么好的方法可以代替将异常跳转到@catch
block 吗?
递归函数的例子,让它更清楚(工作 Playground 代码):
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是具有相同问题的链接:Use exceptions as flow control in parsers。不幸的是,它没有给出答案。
最佳答案
在这种情况下,通过返回一个 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
关于parsing - 跳出深度递归函数调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25315702/