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
相关产品推荐
相关产品推荐

