Swift's @noreturn https://developer.apple.com/library/ios/documentation/Swift/Conceptual/Swift_Programming_Language/Attributes.html属性将函数和方法标记为不返回其调用者。
作为可能最简单的示例,内置函数的签名abort()
's is:
@noreturn func abort()
这为编译器提供了所需的所有信息。例如,以下内容可以正常编译:
func alwaysFail() -> Int {
abort()
}
虽然alwaysFail()
理论上返回一个Int
, Swift 知道执行之后无法继续abort()
叫做。
我原来的代码不起作用的原因是NSException.raise
是一个 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.
}
}
作为第三种选择,我可以使用从未调用过的abort()
后NSException.raise()
安抚编译器。较早的选项,使用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
}