首先,任何函数都会返回一些东西(至少是一个空元组),即使你没有声明任何返回类型。
(@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)
可能还有更多。
(备注:类似的注解存在于其他编程语言或编译器中,例如[[noreturn]]
在 C++11 中,__attribute__((noreturn))
作为 GCC 扩展,或_Noreturn
用于 Clang 编译器。)
如果它也无条件@noreturn
终止进程,您可以标记您自己的函数,例如通过调用内置函数之一,例如
@noreturn func myFatalError() {
// Do something else and then ...
fatalError("Something went wrong!")
}
现在您可以在语句的 else 子句中使用您的函数guard
:
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!")
}