二元表达式 由中缀运算符和左右参数表达式组成。形式如下:左侧参数
二元运算符
右侧参数
关于这些运算符的更多信息,请参阅 第三章:基本运算符 和 第二十九章:高级运算符 。
关于 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 种类型转换运算符:is
、as
、as?
和 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 ! 类型
下一节:基本表达式是最基本的表达式。它们可以单独使用,也可以跟前缀表达式、二元表达式、后缀表达式组合使用。