30.5. 运算符

Swift 标准库定义了许多可供使用的运算符,其中大部分在 第三章:基本运算符第二十九章:高级运算符 中进行了阐述。这一小节将描述哪些字符能用于自定义运算符。

自定义运算符可以由以下其中之一的 ASCII 字符 /=-+!*%、``、&|^? 以及 ~,或者后面语法中规定的任一个 Unicode 字符(其中包含了数学运算符零散符号(Miscellaneous Symbols) 以及印刷符号(Dingbats) 之类的 Unicode 块)开始。在第一个字符之后,允许使用组合型 Unicode 字符。

您也可以以点号(.)开头来定义自定义运算符。这些运算符可以包含额外的点。例如 .+. 会被看作一个单独的运算符。如果某个运算符不是以点号开头的,那么它就无法再包含另外的点号了。例如,+.+ 就会被看作为一个 + 运算符后面跟着一个 .+ 运算符。

虽然您可以用问号 (?) 来自定义运算符,但是这个运算符不能只包含单独的一个问号。此外,虽然运算符可以包含一个惊叹号 (!),但是前缀运算符不能够以问号或者惊叹号开头。

注意

以下这些标记 =->///**/.,前缀运算符 <&?,中缀运算符 ?,后缀运算符 >!? 是被系统保留的。这些符号不能被重载,也不能用作自定义运算符。

运算符两侧的空白被用来区分该运算符是否为前缀运算符、后缀运算符或二元运算符。规则总结如下:

如果运算符两侧都有空白或两侧都无空白,将被看作二元运算符。例如:a+++ba +++ b 当中的 +++ 运算符会被看作二元运算符。

如果运算符只有左侧空白,将被看作一元前缀运算符。例如 a +++b 中的 +++ 运算符会被看做是一元前缀运算符。

如果运算符只有右侧空白,将被看作一元后缀运算符。例如 a+++ b 中的 +++ 运算符会被看作是一元后缀运算符。

如果运算符左侧没有空白并紧跟 (.),将被看作一元后缀运算符。例如 a+++.b 中的 +++ 运算符会被视为一元后缀运算符(即上式被视为 a+++ .b 而不是 a +++ .b)。

鉴于这些规则,([{ 是在运算符前面,)]} 是在运算符后面,以及字符 ,;: 都被视为空白。

以上规则需注意一点。如果预定义运算符 !? 左侧没有空白,则不管右侧是否有空白都将被看作后缀运算符。如果将 ? 用作可选链式调用运算符,左侧必须无空白。如果用于条件运算符 (? :),必须两侧都有空白。

在某些特定的设计中,以 `` 开头的运算符会被分离成两个或多个符号。剩余部分可能会以同样的方式被再次分离。因此,在 Dictionary> 中没有必要添加空白来消除闭合字符 > 的歧义。在这个例子中,闭合字符 > 不会被视为单独的符号,因而不会被错误解析为 >> 运算符。

要学习如何自定义运算符,请参考 29.5. 自定义运算符运算符声明 。要学习如何重载运算符,请参考 29.4. 运算符函数

运算符语法

运算符 → 头部运算符 运算符字符组可选

运算符 → 头部点运算符 点运算符字符组

operator-head

头部运算符/ | = | - | + | ! | ***** | % | < | > | & | | | ^ | ~ | ?

头部运算符 → U+00A1–U+00A7

头部运算符 → U+00A9 或 U+00AB

头部运算符 → U+00AC 或 U+00AE

头部运算符 → U+00B0–U+00B1

头部运算符 → U+00B6,U+00BB,U+00BF,U+00D7,或 U+00F7

头部运算符 → U+2016–U+2017

头部运算符 → U+2020–U+2027

头部运算符 → U+2030–U+203E

头部运算符 → U+2041–U+2053

头部运算符 → U+2055–U+205E

头部运算符 → U+2190–U+23FF

头部运算符 → U+2500–U+2775

头部运算符 → U+2794–U+2BFF

头部运算符 → U+2E00–U+2E7F

头部运算符 → U+3001–U+3003

头部运算符 → U+3008–U+3020

头部运算符 → U+3030

operator-character

运算符字符 → 头部运算符

运算符字符 → U+0300–U+036F

运算符字符 → U+1DC0–U+1DFF

运算符字符 → U+20D0–U+20FF

运算符字符 → U+FE00–U+FE0F

运算符字符 → U+FE20–U+FE2F

运算符字符 → U+E0100–U+E01EF

operator-characters

运算符字符组 → 运算符字符 运算符字符组可选

dot-operator-head

头部点运算符.

dot-operator-character

点运算符字符. | 运算符字符

dot-operator-characters

点运算符字符组 → 点运算符字符 点运算符字符组可选

二元运算符 → 运算符

前缀运算符 → 运算符

后缀运算符 → 运算符