Swift 标准库定义了许多可供使用的运算符,其中大部分在 第三章:基本运算符 和 第二十九章:高级运算符 中进行了阐述。这一小节将描述哪些字符能用于自定义运算符。
自定义运算符可以由以下其中之一的 ASCII 字符 /
、=
、-
、+
、!
、*
、%
、``、&
、|
、^
、?
以及 ~
,或者后面语法中规定的任一个 Unicode 字符(其中包含了数学运算符 、零散符号(Miscellaneous Symbols) 以及印刷符号(Dingbats) 之类的 Unicode 块)开始。在第一个字符之后,允许使用组合型 Unicode 字符。
您也可以以点号(.
)开头来定义自定义运算符。这些运算符可以包含额外的点。例如 .+.
会被看作一个单独的运算符。如果某个运算符不是以点号开头的,那么它就无法再包含另外的点号了。例如,+.+
就会被看作为一个 +
运算符后面跟着一个 .+
运算符。
虽然您可以用问号 (?)
来自定义运算符,但是这个运算符不能只包含单独的一个问号。此外,虽然运算符可以包含一个惊叹号 (!)
,但是前缀运算符不能够以问号或者惊叹号开头。
注意
以下这些标记
=
、->
、//
、/*
、*/
、.
,前缀运算符<
、&
和?
,中缀运算符?
,后缀运算符>
、!
和?
是被系统保留的。这些符号不能被重载,也不能用作自定义运算符。
运算符两侧的空白被用来区分该运算符是否为前缀运算符、后缀运算符或二元运算符。规则总结如下:
如果运算符两侧都有空白或两侧都无空白,将被看作二元运算符。例如:a+++b
和 a +++ 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
点运算符字符组 → 点运算符字符 点运算符字符组可选
二元运算符 → 运算符
前缀运算符 → 运算符
后缀运算符 → 运算符