You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Swift中Finally等价实现及重复return代码优化问题

Swift代码优化:消除冗余return语句

我编写了如下Swift代码:

func untilThrowOrEndOfTokensReached<ConsumedType>(perform: () throws -> ConsumedType) -> [ConsumedType] {

    var results = [ConsumedType]()

    do {
        while isNotAtEnd {
            results.append(try perform())
        }
    } catch {
        return results
    }
    return results
}

其中两处return results显得冗余,我想优化这段代码。之前了解到Swift中可用defer替代类似Finally的逻辑,但尝试以下代码时出现错误:

func untilThrowOrEndOfTokensReached<ConsumedType>(perform: () throws -> ConsumedType) -> [ConsumedType] {
    
    var results = [ConsumedType]()
    defer {
        return results
    }
    do {
        while isNotAtEnd {
            results.append(try perform())
        }
    } catch {
    }
}

错误提示为:'return' cannot transfer control out of a defer statement。请问该如何解决这个问题?或者直接移除catch块中的return results是否可行?


解决方案

直接移除catch块中的return results完全可行,这也是最简洁的优化方式。

修改后的代码如下:

func untilThrowOrEndOfTokensReached<ConsumedType>(perform: () throws -> ConsumedType) -> [ConsumedType] {
    var results = [ConsumedType]()
    do {
        while isNotAtEnd {
            results.append(try perform())
        }
    } catch {
        // 捕获异常后无需额外操作,流程会自然走到函数末尾返回结果
    }
    return results
}

为什么defer的写法无效?

Swift的defer块仅用于在函数退出前执行清理或收尾操作,不允许在defer块内使用return传递控制权——它只保证代码会被执行,但不能用来改变函数的返回逻辑路径,这就是你收到错误提示的原因。

逻辑说明

原代码中,无论是循环正常执行完毕,还是中途抛出异常被catch块捕获,最终都会执行到函数最后一行的return results,两者的返回结果完全一致。因此删除catch块内的return语句,既消除了冗余,也不会改变原有逻辑。


内容的提问来源于stack exchange,提问作者Gargo

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.24 00:00:17