gpt4 book ai didi

swift - 何时以及如何在 Swift 中使用@noreturn 属性?

转载 作者:行者123 更新时间:2023-11-28 08:15:34 25 4
gpt4 key购买 nike

我在 guard-else 流的上下文中读取了关键字 else 之后用花括号括起来的代码块,必须调用标有 的函数noreturn 属性或使用 returnbreakcontinuethrow 转移控制。

最后一部分很清楚,而第一部分我不太明白。

首先,即使您没有声明任何返回类型,任何函数都会返回一些东西(至少是一个空元组)。其次,我们什么时候可以使用 noreturn 函数?文档是否建议使用 noreturn 标记一些核心内置方法?

The else clause of a guard statement is required, and must either call a function marked with the noreturn attribute or transfer program control outside the guard statement’s enclosing scope using one of the following statements:

return

break

continue

throw

这是 source .

最佳答案

First of all, any function returns something (an empty tuple at least) even if you don't declare any return type.

(@noreturn 已过时;请参阅下面的 Swift 3 更新。)不,有些功能会立即终止进程并且返回调用者。这些在 Swift 中被标记用@noreturn,比如

@noreturn public func fatalError(@autoclosure message: () -> String = default, file: StaticString = #file, line: UInt = #line)
@noreturn public func preconditionFailure(@autoclosure message: () -> String = default, file: StaticString = #file, line: UInt = #line)
@noreturn public func abort()
@noreturn public func exit(_: Int32)

而且可能还有更多。

(备注:类似的注解存在于其他编程语言中或编译器,例如 C++11 中的 [[noreturn]],作为 GCC 扩展的 __attribute__((noreturn)),或 _Noreturn为了Clang 编译器。)

如果你自己的函数也终止了,你可以用@noreturn标记你自己的函数该过程无条件地,例如通过调用内置函数之一,例如

@noreturn func myFatalError() {
// Do something else and then ...
fatalError("Something went wrong!")
}

现在您可以在 guard 语句的 else 子句中使用您的函数:

guard let n = Int("1234") else { myFatalError() }

@noreturn 函数也可以用来标记“不应该发生”并指示编程错误。一个简单的例子(摘自 Missing return UITableViewCell ):

override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
let cell: MyTableViewCell

switch (indexPath.row) {
case 0:
cell = tableView.dequeueReusableCellWithIdentifier("cell0", forIndexPath: indexPath) as! MyTableViewCell
cell.backgroundColor = UIColor.greenColor()
case 1:
cell = tableView.dequeueReusableCellWithIdentifier("cell1", forIndexPath: indexPath) as! MyTableViewCell
cell.backgroundColor = UIColor.redColor()
default:
myFatalError()
}
// Setup other cell properties ...
return cell
}

如果没有 myFatalError() 标记为 @noreturn,编译器将在默认情况下提示缺少返回。


更新:在 Swift 3(Xcode 8 beta 6)中,@noreturn 属性已被 Never 返回类型取代,所以上面的例子现在可以写成

func myFatalError() -> Never  {
// Do something else and then ...
fatalError("Something went wrong!")
}

关于swift - 何时以及如何在 Swift 中使用@noreturn 属性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42624171/

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