跳出深度递归函数调用

时间:2014-08-14 19:00:44

标签: parsing exception recursion swift

我在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是一个具有相同问题的链接:在解析器中使用异常作为流控制。不幸的是,它没有给出答案。

1 个答案:

答案 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