gpt4 book ai didi

swift - 由于抛出的异常,让 Swift 相信函数永远不会返回

转载 作者:IT王子 更新时间:2023-10-29 05:22:24 25 4
gpt4 key购买 nike

因为 Swift 没有抽象方法,我正在创建一个默认实现无条件引发错误的方法。这会强制任何子类覆盖抽象方法。我的代码如下所示:

class SuperClass {
func shouldBeOverridden() -> ReturnType {
let exception = NSException(
name: "Not implemented!",
reason: "A concrete subclass did not provide its own implementation of shouldBeOverridden()",
userInfo: nil
)
exception.raise()
}
}

问题:因为函数需要返回一个值,而上面的函数没有return语句,所以编译失败。我需要一些方法来说服编译器该函数永远无法完成执行,因为它总是会引发错误。

当所有的错误处理似乎都是库级的,因此超出了编译器的理解范围时,在 Swift 中如何做到这一点?是否有任何类型的语言级功能(希望优雅地)终止程序的执行?

最佳答案

swift 的 @noreturn属性将函数和方法标记为不返回其调用者。

作为可能是最简单的例子,内置函数abort() 的签名是:

@noreturn func abort()

这为编译器提供了它需要的所有信息。例如,以下将编译得很好:

func alwaysFail() -> Int {
abort()
}

尽管 alwaysFail() 理论上返回一个 Int,但 Swift 知道在 abort() 被调用后执行无法继续。

我的原始代码不起作用的原因是因为 NSException.raise 是一个 pre-Swift 方法,因此没有 @noreturn 属性。为了轻松解决这个问题,我可以使用 abort():

func shouldBeOverridden() -> ReturnType {
println("Subclass has not implemented abstract method `shouldBeOverridden`!")
abort()
}

或者,如果我仍然想使用 NSException,我可以定义一个具有适当属性的扩展

extension NSException {
@noreturn func noReturnRaise() {
self.raise()
abort() // This will never run, but Swift will complain that the function isn't really @noreturn if I don't call a @noreturn function before execution finishes.
}
}

作为第三种选择,我可以在 NSException.raise() 之后使用从未调用的 abort() 来安抚编译器。较早的选项使用 extension,实际上只是执行此操作的抽象:

func shouldBeOverridden() -> ReturnType {
let exception = NSException(
name: "Not implemented!",
reason: "A concrete subclass did not provide its own implementation of shouldBeOverridden()",
userInfo: nil
)
exception.raise()
abort() // never called
}

关于swift - 由于抛出的异常,让 Swift 相信函数永远不会返回,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27829132/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com