32.2. 二元表达式

二元表达式 由中缀运算符和左右参数表达式组成。形式如下:左侧参数 二元运算符 右侧参数

关于这些运算符的更多信息,请参阅 第三章:基本运算符第二十九章:高级运算符

关于 Swift 标准库提供的运算符的更多信息,请参阅 Swift Standard Library Operators Reference

注意

在解析时,一个二元表达式将作为一个扁平列表表示,然后根据运算符的优先级,再进一步进行组合。例如,2 + 3 * 5 首先被看作具有五个元素的列表,即 2+3*5,随后根据运算符优先级组合为 (2 + (3 * 5))

binary-expression

二元表达式语法

二元表达式 → 二元运算符 前缀表达式

二元表达式 → 赋值运算符 try 运算符可选 前缀表达式

二元表达式 → 条件运算符 try 运算符可选 前缀表达式

二元表达式 → 类型转换运算符

binary-expressions

二元表达式列表 → 二元表达式 二元表达式列表可选

赋值表达式

赋值表达式会为某个给定的表达式赋值,形式如下;表达式 =

右边的值会被赋值给左边的表达式。如果左边表达式是一个元组,那么右边必须是一个具有同样元素个数的元组。(嵌套元组也是允许的。)右边的值中的每一部分都会被赋值给左边的表达式中的相应部分。例如:

(a, _, (b, c)) = ("test", 9.45, (12, 3))
// a 为 "test",b 为 12,c 为 3,9.45 会被忽略

赋值运算符不返回任何值。

赋值运算符语法

assignment-operator

赋值运算符=

三元条件运算符

三元条件运算符 会根据条件来对两个给定表达式中的一个进行求值,形式如下:条件 ? 表达式(条件为真则使用) : 表达式(条件为假则使用)

如果条件为真,那么对第一个表达式进行求值并返回结果。否则,对第二个表达式进行求值并返回结果。未使用的表达式不会进行求值。

关于使用三元条件运算符的例子,请参阅 3.7. 三元运算符(Ternary Conditional Operator)

三元条件运算符语法

conditional-operator

三元条件运算符? 表达式 :

类型转换运算符

有 4 种类型转换运算符:isasas?as!。它们有如下的形式:表达式 is 类型表达式 as 类型表达式 as? 类型表达式 as! 类型

is 运算符在运行时检查表达式能否向下转化为指定的类型,如果可以则返回 ture,否则返回 false

as 运算符在编译时执行向上转换和桥接。向上转换可将表达式转换成父类的实例而无需使用任何中间变量。以下表达式是等价的:

func f(any: Any) { print("Function for Any") }
func f(int: Int) { print("Function for Int") }
let x = 10
f(x)
// 打印“Function for Int”
let y: Any = x
f(y)
// 打印“Function for Any”
f(x as Any)
// 打印“Function for Any”

桥接可将 Swift 标准库中的类型(例如 String)作为一个与之相关的 Foundation 类型(例如 NSString)来使用,而不需要新建一个实例。关于桥接的更多信息,请参阅 Working with Foundation Types

as? 运算符有条件地执行类型转换,返回目标类型的可选值。在运行时,如果转换成功,返回的可选值将包含转换后的值,否则返回 nil。如果在编译时就能确定转换一定会成功或是失败,则会导致编译报错。

as! 运算符执行强制类型转换,返回目标类型的非可选值。如果转换失败,则会导致运行时错误。表达式 x as! T 效果等同于 (x as? T)!

关于类型转换的更多内容和例子,请参阅 第二十章:类型转换

type-casting-operator

类型转换运算符语法

类型转换运算符is 类型

类型转换运算符as 类型

类型转换运算符as ? 类型

类型转换运算符as ! 类型

下一节:基本表达式是最基本的表达式。它们可以单独使用,也可以跟前缀表达式、二元表达式、后缀表达式组合使用。