32. 前缀表达式

前缀表达式由可选的前缀运算符和表达式组成。前缀运算符只接收一个参数,表达式则紧随其后。关于这些运算符的更多信息,请参阅 第三章:基本运算符第二十九章:高级运算符 。关于 Swift 标准库提供的运算符的更多信息,请参阅 Operators Declarations

除了标准库运算符,你也可以对某个变量使用 & 运算符,从而将其传递给函数的输入输出参数。更多信息,请参阅 输入输出参数

  • prefix-expression:
    • 前缀表达式 → 前缀运算符可选 后缀表达式
    • 前缀表达式 → 输入输出表达式

输入输出表达式

输入输出表达式 将函数调用表达式传入的变量标记为输入输出实参。更多关于输入输出形参的信息和例子,请参阅 输入输出参数。输入输出表达式也可以用于将非指针实参传入到需要指针的上下文中,如指针类型的隐式转换中所述。

in-out-expression

输入输出表达式& 标识符

Try 运算符

  • try 表达式try 运算符加上紧随其后的可抛出错误的表达式组成,形式如下:
  • try 表达式:
    • try 表达式的返回值是该表达式的值。
  • 可选 try 表达式try? 运算符加上紧随其后的可抛出错误的表达式组成,形式如下:
    • try? 表达式:
    • 如果表达式没有抛出错误,可选 try 表达式的返回值是可选的该表达式的值,否则,返回值为 nil
  • 强制 try 表达式try! 运算符加上紧随其后的可抛出错误的表达式组成,形式如下:
    • try! 表达式
    • 强制 try 表达式的返回值是该表达式的值。如果该表达式抛出了错误,将会引发运行时错误。

在二元运算符左侧的表达式被标记上 trytry? 或者 try! 时,这个运算符对整个二元表达式都产生作用。也就是说,你可以使用括号来明确运算符的作用范围。

Await 运算符

await 表达式await 运算符加上紧随其后的异步操作结果的表达式。形式如下:await 表达式

await 表达式返回值就是该表达式的值。被 await 标记的表达式被称为潜在的暂停点

异步函数的执行可以在每个标记 await 的表达式的位置暂停。除此之外,并发代码的执行永远不会在其他位置暂停。这意味着在潜在暂停点之间的代码可以暂时打破不变量的状态进行安全更新,只要更新在下一个潜在暂停点之前完成。

await 表达式只能在异步的上下文中出现,比如传入 async(priority:operation:) 函数的尾随闭包中。它不能在 defer 语句的闭包中,或者在同步函数的自动闭包中出现。

在二元运算符左侧的表达式被标记上 await 运算符时,这个运算符对整个二元表达式都产生作用。也就是说,你可以使用括号来明确运算符的作用范围。

// await 对两个函数调用都产生作用
sum = await someAsyncFunction() + anotherAsyncFunction()
// await 对两个函数调用都产生作用
sum = await (someAsyncFunction() + anotherAsyncFunction())
// 错误:await 只对第一个函数调用产生作用
sum = (await someAsyncFunction()) + anotherAsyncFunction()

await 表达式不能出现在二元运算符的的右侧,除非二元运算符是赋值运算符或者 await 表达式是被圆括号括起来的。

如果表达式中同时包含 tryawait 运算符,try 运算符必须在前面。

下一节:Swift 是一门开发 iOS, macOS, watchOS 和 tvOS 应用的新语言。然而,如果你有 C 或者 Objective-C 开发经验的话,你会发现 Swift 的很多内容都是你熟悉的。