词法结构

最后更新于:2022-04-01 05:04:50

> 1.0 翻译:[superkam](https://github.com/superkam) 校对:[numbbbbb](https://github.com/numbbbbb) > > 2.0 翻译+校对:[buginux]([KYawn](https://github.com/buginux) 本页包含内容: [TOC=2] Swift 的“词法结构( _lexical structure_ )”描述了能构成该语言中合法标记( _tokens_ )的字符序列。这些合法标记组成了语言中最底层的构建基块,并在之后的章节中用于描述语言的其他部分。 通常情况下,标记是在随后将介绍的语法约束下,由 Swift 源文件的输入文本中提取可能的最长子串生成。这种方法称为“最长匹配项( _longest match_ )”,或者“最大适合”( _maximal munch_ )。 ## 空白与注释 空白( _whitespace_ )有两个用途:分隔源文件中的标记和帮助区分运算符属于前缀还是后缀(参见 [运算符](51325)),在其他情况下则会被忽略。以下的字符会被当作空白:空格( _space_ )(U+0020)、换行符( _line feed_ )(U+000A)、回车符( _carriage return_ )(U+000D)、水平制表符( _horizontal tab_ )(U+0009)、垂直制表符(_vertical tab_ )(U+000B)、换页符( _form feed_ )(U+000C)以及空( _null_ )(U+0000)。 注释( _comments_ )被编译器当作空白处理。单行注释由 `//` 开始直至遇到换行符( _line feed_ )(U+000A)或者回车符( _carriage return_ )(U+000D)。多行注释由 `/*` 开始,以 `*/` 结束。注释允许嵌套,但注释标记必须匹配。 ## 标识符 标识符( _identifiers_ )可以由以下的字符开始:大写或小写的字母 `A` 到 `Z`、下划线 `_`、基本多文种平面( _Basic Multilingual Plane_ )中的 Unicode 非组合字符以及基本多文种平面以外的非专用区( _Private Use Area_ )字符。首字符之后,允许使用数字和 Unicode 字符组合。 使用保留字( _reserved word_ )作为标识符,需要在其前后增加反引号 \`。例如,`class` 不是合法的标识符,但可以使用 \`class\`。反引号不属于标识符的一部分,\`x\` 和 `x` 表示同一标识符。 闭包( _closure_ )中如果没有明确指定参数名称,参数将被隐式命名为 `$0`、`$1`、`$2`等等。 这些命名在闭包作用域范围内是合法的标识符。 > 标识符语法 > _标识符_ → [ _头部标识符_ ](http://wiki.jikexueyuan.com/project/swift/chapter3/02_Lexical_Structure.html#identifier_head) [ _标识符字符组_ ](http://wiki.jikexueyuan.com/project/swift/chapter3/02_Lexical_Structure.html#identifier_characters)可选 > _标识符_ → [ _头部标识符_ ](http://wiki.jikexueyuan.com/project/swift/chapter3/02_Lexical_Structure.html#identifier_head) [ _标识符字符组_ ](http://wiki.jikexueyuan.com/project/swift/chapter3/02_Lexical_Structure.html#identifier_characters)可选 > _标识符_ → [ _隐式参数名_ ](http://wiki.jikexueyuan.com/project/swift/chapter3/02_Lexical_Structure.html#implicit_parameter_name) > _标识符列表_ → [_标识符_](http://wiki.jikexueyuan.com/project/swift/chapter3/02_Lexical_Structure.html#identifier) | [_标识符_](http://wiki.jikexueyuan.com/project/swift/chapter3/02_Lexical_Structure.html#identifier) , [_标识符列表_](http://wiki.jikexueyuan.com/project/swift/chapter3/02_Lexical_Structure.html#identifier_list) > > _头部标识符_  → 大写或小写字母 A - Z > _头部标识符_  → U+00A8, U+00AA, U+00AD, U+00AF, U+00B2–U+00B5, or U+00B7–U+00BA > _头部标识符_ → U+00BC–U+00BE, U+00C0–U+00D6, U+00D8–U+00F6, or U+00F8–U+00FF > _头部标识符_ → U+0100–U+02FF, U+0370–U+167F, U+1681–U+180D, or U+180F–U+1DBF > _头部标识符_ → U+1E00–U+1FFF > _头部标识符_ → U+200B–U+200D, U+202A–U+202E, U+203F–U+2040, U+2054, or U+2060–U+206F > _头部标识符_ → U+2070–U+20CF, U+2100–U+218F, U+2460–U+24FF, or U+2776–U+2793 > _头部标识符_ → U+2C00–U+2DFF or U+2E80–U+2FFF > _头部标识符_ → U+3004–U+3007, U+3021–U+302F, U+3031–U+303F, or U+3040–U+D7FF > _头部标识符_ → U+F900–U+FD3D, U+FD40–U+FDCF, U+FDF0–U+FE1F, or U+FE30–U+FE44 > _头部标识符_ → U+FE47–U+FFFD > _头部标识符_ → U+10000–U+1FFFD, U+20000–U+2FFFD, U+30000–U+3FFFD, or U+40000–U+4FFFD > _头部标识符_ → U+50000–U+5FFFD, U+60000–U+6FFFD, U+70000–U+7FFFD, or U+80000–U+8FFFD > _头部标识符_ → U+90000–U+9FFFD, U+A0000–U+AFFFD, U+B0000–U+BFFFD, or U+C0000–U+CFFFD > _头部标识符_ → U+D0000–U+DFFFD or U+E0000–U+EFFFD > _标识符字符_ → 数值 0 - 9 > _标识符字符_ → U+0300–U+036F, U+1DC0–U+1DFF, U+20D0–U+20FF, or U+FE20–U+FE2F > _标识符字符_ → [ _头部标识符_ ](http://wiki.jikexueyuan.com/project/swift/chapter3/02_Lexical_Structure.html#identifier_head)  > _标识符字符组_ → [ _标识符字符_ ](http://wiki.jikexueyuan.com/project/swift/chapter3/02_Lexical_Structure.html#identifier_character) [_标识符字符列表_](http://wiki.jikexueyuan.com/project/swift/chapter3/02_Lexical_Structure.html#identifier_characters)可选 > > _隐式参数名_ → $  _十进制数字列表_ ## 关键字和符号 下面这些被保留的关键字(_keywords_)不允许用作标识符,除非被反引号转义,具体描述请参考 [标识符](http://wiki.jikexueyuan.com/project/swift/chapter3/02_Lexical_Structure.html#identifiers)。 * 用在声明中的关键字:_class_、_deinit_、_enum_、_extension_、_func_、_import_、_init_、_let_、_protocol_、_static_、_struct_、_subscript_、_typealias_、_var_ * 用在语句中的关键字:_break_、_case_、_continue_、_default_、_do_、_else_、_fallthrough_、_if_、_in_、_for_、_return_、_switch_、_where_、_while_ * 用在表达式和类型中的关键字:_as_、_dynamicType_、_is_、_new_、_super_、_self_、_Self_、_Type_、___COLUMN___、___FILE___、___FUNCTION___、___LINE___ * 用在模式中的关键字: _ * 特定上下文中被保留的关键字:_associativity_、_didSet_、_get_、_infix_、_inout_、_left_、_mutating_、_none_、_nonmutating_、_operator_、_override_、_postfix_、_precedence_、_prefix_、_right_、_set_、_unowned_、_unowned(safe)_、_unowned(unsafe)_、_weak_、_willSet_,这些关键字在特定上下文之外可以被用于标识符。 以下标记被当作保留符号,不能用于自定义操作符:`(`、`)`、`{`、`}`、`[`、`]`、`.`、`,`、`:`、`;`、`=`、`@`、`#`、`&(作为前缀操作符)`、`->`、`````、`?` 和 `!(作为后缀操作符)`。 ## 字面量 字面量是用来表示源码中某种特定类型的值,比如一个数字或字符串。 下面是字面量的一些示例: ~~~ 42 // 整型字面量 3.14159 // 浮点型字面量 "Hello, world!" // 字符串型字面量 true // 布尔型字面量 ~~~ 字面量本身并不包含类型信息。事实上,一个字面量会被解析为拥有无限的精度,然后 Swift 的类型推导会尝试去推导出这个字面量的类型。比如,在 `let x: Int8 = 42` 这个声明中,Swift 使用了显式类型标注(`: Int8`)来推导出 `42` 这个整型字面量的类型是 `Int8`。如果没有可用的类型信息, Swift 则会从标准库中定义的字面量类型中推导出一个默认的类型。整型字面量的默认类型是 `Int`,浮点型字面量的默认类型是 `Double`,字符串型字面量的默认类型是 `String`,布尔型字面量的默认类型是 `Bool`。比如,在 `let str = "Hello, world"` 这个声明中,字符串 `"Hello, world"`的默认推导类型就是 `String`。 当为一个字面量值指定了类型标注的时候,这个注解的类型必须能通过这个字面量值实例化后得到。也就是说,这个类型必须遵守这些 Swift 标准库协议中的一个:整型字面量的`IntegerLiteralConvertible`协议、符点型字面量的`FloatingPointLiteralConvertible`协议、字符串字面量的`StringLiteralConvertible`协议以及布尔型字面量的`BooleanLiteralConvertible`协议。比如,`Int8` 遵守了 `IntegerLiteralConvertible`协议,因此它能在 `let x: Int8 = 42` 这个声明中作为整型字面量 `42` 的类型标注。 > 字面量语法 > _字面量_ → [_数字型字面量_](http://wiki.jikexueyuan.com/project/swift/chapter3/02_Lexical_Structure.html#numeric_literal) | [_字符串型字面量_](http://wiki.jikexueyuan.com/project/swift/chapter3/02_Lexical_Structure.html#string_literal) | [_布尔型字面量_](http://wiki.jikexueyuan.com/project/swift/chapter3/02_Lexical_Structure.html#boolean_literal) | [_nil型字面量_](http://wiki.jikexueyuan.com/project/swift/chapter3/02_Lexical_Structure.html#nil_literal) > > _数字型字面量_ → -可选[_整型字面量_](http://wiki.jikexueyuan.com/project/swift/chapter3/02_Lexical_Structure.html#integer_literal) | -可选[_符点型字面量_](http://wiki.jikexueyuan.com/project/swift/chapter3/02_Lexical_Structure.html#floating_point_literal) > _布尔型字面量_ → true | false > _nil型字面量_ → nil ### 整型字面量 整型字面量(_integer literals_)表示未指定精度整型数的值。整型字面量默认用十进制表示,可以加前缀来指定其他的进制,二进制字面量加 `0b`,八进制字面量加 `0o`,十六进制字面量加 `0x`。 十进制字面量包含数字 `0` 至 `9`。二进制字面量只包含 `0` 或 `1`,八进制字面量包含数字 `0` 至 `7`,十六进制字面量包含数字 `0` 至 `9` 以及字母 `A` 至 `F` (大小写均可)。 负整数的字面量在整型字面量前加减号 `-`,比如 `-42`。 整型字面面可以使用下划线 `_` 来增加数字的可读性,下划线会被系统忽略,因此不会影响字面量的值。同样地,也可以在数字前加 `0`,并不会影响字面量的值。 除非特别指定,整型字面量的默认推导类型为 Swift 标准库类型中的 `Int`。Swift 标准库还定义了其他不同长度以及是否带符号的整数类型,请参考 [整数类型](https://developer.apple.com/library/prerelease/ios/documentation/Swift/Conceptual/Swift_Programming_Language/TheBasics.html#//apple_ref/doc/uid/TP40014097-CH5-ID323)。 > 整型字面量语法 > _整型字面量_ → [_二进制字面量_](http://wiki.jikexueyuan.com/project/swift/chapter3/02_Lexical_Structure.html#binary_literal) > _整型字面量_ → [_八进制字面量_](http://wiki.jikexueyuan.com/project/swift/chapter3/02_Lexical_Structure.html#octal_literal) > _整型字面量_ → [_十进制字面量_](http://wiki.jikexueyuan.com/project/swift/chapter3/02_Lexical_Structure.html#decimal_literal) > _整型字面量_ → [_十六进制字面量_](http://wiki.jikexueyuan.com/project/swift/chapter3/02_Lexical_Structure.html#hexadecimal_literal) > _二进制字面量_ → 0b [_二进制数字_](http://wiki.jikexueyuan.com/project/swift/chapter3/02_Lexical_Structure.html#binary_digit) [_二进制字面量字符组_](http://wiki.jikexueyuan.com/project/swift/chapter3/02_Lexical_Structure.html#binary_literal_characters)可选 > _二进制数字_ → 数值 0 到 1 > _二进制字面量字符_ → [_二进制数字_](http://wiki.jikexueyuan.com/project/swift/chapter3/02_Lexical_Structure.html#binary_digit) | _ > _二进制字面量字符组_ → [_二进制字面量字符_](http://wiki.jikexueyuan.com/project/swift/chapter3/02_Lexical_Structure.html#binary_literal_character) [_二进制字面量字符组_](http://wiki.jikexueyuan.com/project/swift/chapter3/02_Lexical_Structure.html#binary_literal_characters)可选 > > _八进制字面量_ → 0o [_八进字数字_](http://wiki.jikexueyuan.com/project/swift/chapter3/02_Lexical_Structure.html#octal_digit) [_八进制字符列表_](http://wiki.jikexueyuan.com/project/swift/chapter3/02_Lexical_Structure.html#octal_literal_characters)可选 > _八进字数字_ → 数值 0 到 7 > _八进制字符_ → [_八进字数字_](http://wiki.jikexueyuan.com/project/swift/chapter3/02_Lexical_Structure.html#octal_digit) | _ > _八进制字符组_ → [_八进制字符_](http://wiki.jikexueyuan.com/project/swift/chapter3/02_Lexical_Structure.html#octal_literal_character) [_八进制字符列表_](http://wiki.jikexueyuan.com/project/swift/chapter3/02_Lexical_Structure.html#octal_literal_characters)可选  > _十进制字面量_ → [_十进制数字_](http://wiki.jikexueyuan.com/project/swift/chapter3/02_Lexical_Structure.html#decimal_digit) [_十进制字符组_](http://wiki.jikexueyuan.com/project/swift/chapter3/02_Lexical_Structure.html#decimal_literal_characters)可选 > _十进制数字_ → 数值 0 到 9 > _十进制数字列表_ → [_十进制数字_](http://wiki.jikexueyuan.com/project/swift/chapter3/02_Lexical_Structure.html#decimal_digit) [_十进制数字列表_](http://wiki.jikexueyuan.com/project/swift/chapter3/02_Lexical_Structure.html#decimal_digits)可选 > _十进制字符_ → [_十进制数字_](http://wiki.jikexueyuan.com/project/swift/chapter3/02_Lexical_Structure.html#decimal_digit) | _ > _十进制字符列表_ → [_十进制字符_](http://wiki.jikexueyuan.com/project/swift/chapter3/02_Lexical_Structure.html#decimal_literal_character) [_十进制字符列表_](http://wiki.jikexueyuan.com/project/swift/chapter3/02_Lexical_Structure.html#decimal_literal_characters)可选  > _十六进制字面量_ → 0x [_十六进制数字_](http://wiki.jikexueyuan.com/project/swift/chapter3/02_Lexical_Structure.html#hexadecimal_digit) [_十六进制字面量字符列表_](http://wiki.jikexueyuan.com/project/swift/chapter3/02_Lexical_Structure.html#hexadecimal_literal_characters)可选 > _十六进制数字_ → 数值 0 到 9, 字母 a 到 f, 或 A 到 F > _十六进制字符_ → [_十六进制数字_](http://wiki.jikexueyuan.com/project/swift/chapter3/02_Lexical_Structure.html#hexadecimal_digit) | _ > _十六进制字面量字符列表_ → [_十六进制字符_](http://wiki.jikexueyuan.com/project/swift/chapter3/02_Lexical_Structure.html#hexadecimal_literal_character) [_十六进制字面量字符列表_](http://wiki.jikexueyuan.com/project/swift/chapter3/02_Lexical_Structure.html#hexadecimal_literal_characters)可选 ### 浮点型字面量 浮点型字面量(_floating-point literals_)表示未指定精度浮点数的值。 浮点型字面量默认用十进制表示(无前缀),也可以用十六进制表示(加前缀 `0x`)。 十进制浮点型字面量(_decimal floating-point literals_)由十进制数字串后跟小数部分或指数部分(或两者皆有)组成。十进制小数部分由小数点 `.` 后跟十进制数字串组成。指数部分由大写或小写字母 `e` 为前缀后跟十进制数字串组成,这串数字表示 `e` 之前的数量乘以 10 的几次方。例如:`1.25e2` 表示 `1.25 ⨉ 10^2`,也就是 `125.0`;同样,`1.25e-2`表示 `1.25 ⨉ 10^-2`,也就是 `0.0125`。 十六进制浮点型字面量(_hexadecimal floating-point literals_)由前缀 `0x` 后跟可选的十六进制小数部分以及十六进制指数部分组成。十六进制小数部分由小数点后跟十六进制数字串组成。指数部分由大写或小写字母 `p` 为前缀后跟十进制数字串组成,这串数字表示 `p` 之前的数量乘以 2 的几次方。例如:`0xFp2` 表示 `15 ⨉ 2^2`,也就是 `60`;同样,`0xFp-2` 表示 `15 ⨉ 2^-2`,也就是 `3.75`。 负的浮点型字面量由一元运算符减号 `-` 和浮点型字面量组成,例如 `-42.5`。 浮点型字面量允许使用下划线 `_` 来增强数字的可读性,下划线会被系统忽略,因此不会影响字面量的值。同样地,也可以在数字前加 `0`,并不会影响字面量的值。 除非特别指定,浮点型字面量的默认推导类型为 Swift 标准库类型中的 `Double`,表示64位浮点数。Swift 标准库也定义了 `Float` 类型,表示32位浮点数。 > 浮点型字面量语法 > _浮点数字面量_ → [_十进制字面量_](http://wiki.jikexueyuan.com/project/swift/chapter3/02_Lexical_Structure.html#decimal_literal) [_十进制分数_](http://wiki.jikexueyuan.com/project/swift/chapter3/02_Lexical_Structure.html#decimal_fraction)可选 [_十进制指数_](http://wiki.jikexueyuan.com/project/swift/chapter3/02_Lexical_Structure.html#decimal_exponent)可选 > _浮点数字面量_ → [_十六进制字面量_](http://wiki.jikexueyuan.com/project/swift/chapter3/02_Lexical_Structure.html#hexadecimal_literal) [_十六进制分数_](http://wiki.jikexueyuan.com/project/swift/chapter3/02_Lexical_Structure.html#hexadecimal_fraction)可选 [_十六进制指数_](http://wiki.jikexueyuan.com/project/swift/chapter3/02_Lexical_Structure.html#hexadecimal_exponent)  > _十进制分数_ → . [_十进制字面量_](http://wiki.jikexueyuan.com/project/swift/chapter3/02_Lexical_Structure.html#decimal_literal) > _十进制指数_ → [_浮点数e_](http://wiki.jikexueyuan.com/project/swift/chapter3/02_Lexical_Structure.html#floating_point_e) [_正负号_](http://wiki.jikexueyuan.com/project/swift/chapter3/02_Lexical_Structure.html#sign)可选 [_十进制字面量_](http://wiki.jikexueyuan.com/project/swift/chapter3/02_Lexical_Structure.html#decimal_literal) > _十六进制分数_ → . [_十六进制数字_](http://wiki.jikexueyuan.com/project/swift/chapter3/02_Lexical_Structure.html#hexadecimal_digit) [_十六进制字面量字符列表_](http://wiki.jikexueyuan.com/project/swift/chapter3/02_Lexical_Structure.html#hexadecimal_literal_characters)可选 > _十六进制指数_ → [_浮点数p_](http://wiki.jikexueyuan.com/project/swift/chapter3/02_Lexical_Structure.html#floating_point_p) [_正负号_](http://wiki.jikexueyuan.com/project/swift/chapter3/02_Lexical_Structure.html#sign)可选 [_十进制字面量_](http://wiki.jikexueyuan.com/project/swift/chapter3/02_Lexical_Structure.html#decimal_literal) > _浮点数e_ → e | E > _浮点数p_ → p | P > _正负号_ → + | - ### 字符串型字面量 字符串型字面量( _string literal_ )由被包在双引号中的一串字符组成,形式如下: ~~~ "characters" ~~~ 字符串型字面量中不能包含未转义的双引号 (`"`)、未转义的反斜线(`\`)、回车符( _carriage return_ )或换行符( _line feed_ )。 可以在字符串字面量中使用的转义特殊符号如下: * 空字符(Null Character)`\0` * 反斜线(Backslash)`\\` * 水平制表符(Horizontal Tab)`\t` * 换行符(Line Feed)`\n` * 回车符(Carriage Return)`\r` * 双引号(Double Quote)`\"` * 单引号(Single Quote)`\'` * Unicode标量 `\u{n}`,n为一到八位的十六进制数字 字符串字面量允许在反斜杠小括号 `\()` 中插入表达式的值。插入表达式( _interpolated expression_ )不能包含未转义的双引号 `"`、未转义的反斜线 `\`、回车符或者换行符。表达式结果的类型必须在 _String_ 类中有对应的初始化方法。 例如,以下所有字符串字面量的值都是相同的: ~~~ "1 2 3" "1 2 \(3)" "1 2 \(1 + 2)" let x = 3; "1 2 \(x)" ~~~ 字符串字面量的默认推导类型为 `String`。组成字符串的字符默认推导类型为 `Character`。更多有关 `String` 和`Character` 的信息请参照 [字符串和字符](http://wiki.jikexueyuan.com/project/swift/chapter2/03_Strings_and_Characters.html)。 > 字符型字面量语法 > _字符串字面量_ → " [_引用文本_](http://wiki.jikexueyuan.com/project/swift/chapter3/02_Lexical_Structure.html#quoted_text)可选 " > _引用文本_ → [_引用文本条目_](http://wiki.jikexueyuan.com/project/swift/chapter3/02_Lexical_Structure.html#quoted_text_item) [_引用文本_](http://wiki.jikexueyuan.com/project/swift/chapter3/02_Lexical_Structure.html#quoted_text) 可选 > _引用文本条目_ → [_转义字符_](http://wiki.jikexueyuan.com/project/swift/chapter3/02_Lexical_Structure.html#escaped_character) > _引用文本条目_ → ( [_表达式_](http://wiki.jikexueyuan.com/project/swift/chapter3/04_Expressions.html) ) > _引用文本条目_ → 除了"­, \­, U+000A, 或者 U+000D的所有Unicode的字符 > _转义字符_ → \0 | \ | \t | \n | \r | \" | \' > _转义字符_ → \u { [_unicode标量数字_](http://wiki.jikexueyuan.com/project/swift/chapter3/02_Lexical_Structure.html#unicode_scalar_digits) } _unicode标量数字_ → 一到八位的十六进制数字 ## 运算符 Swift 标准库定义了许多可供使用的运算符,其中大部分在 [基础运算符](51325) 和 [高级运算符](51363) 中进行了阐述。这一小节将描述哪些字符能用于自定义运算符。 自定义运算符可以由以下其中之一的 ASCII 字符 `/`、`=`、 `-`、`+`、`!`、`*`、`%`、`<`、`>`、`&`、`|`、`^`、`?` 以及 `~`, 或者后面语法中规定的任一个 Unicode 字符开始。在第一个字符之后,允许使用组合型 Unicode 字符。也可以使用两个或者多个的点号来自定义运算符(比如, `....`)。虽然可以自定义包含问号`?`的运算符,但是这个运算符不能只包含单独的一个问号。 ~~~ 注意: 以下这些标记 =, ->, //, /*, */, ., <(前缀运算符), &, and ?, ?(中缀运算符), >(后缀运算符), ! 以及 ? 是被系统保留的。这些标记不能被重载,也不能用于自定义操作符。 ~~~ 运算符两侧的空白被用来区分该运算符是否为前缀运算符( _prefix operator_ )、后缀运算符( _postfix operator_ )或二元运算符( _binary operator_ )。规则总结如下: * 如果运算符两侧都有空白或两侧都无空白,将被看作二元运算符。例如:`a+b` 和 `a + b` 中的运算符 `+` 被看作二元运算符。 * 如果运算符只有左侧空白,将被看作前缀一元运算符。例如 `a ++b` 中的 `++` 被看作前缀一元运算符。 * 如果运算符只有右侧空白,将被看作后缀一元运算符。例如 `a++ b` 中的 `++` 被看作后缀一元运算符。 * 如果运算符左侧没有空白并紧跟 `.`,将被看作后缀一元运算符。例如 `a++.b` 中的 `++` 被看作后缀一元运算符(即上式被视为 `a++ .b` 而非 `a ++ .b`)。 鉴于这些规则,运算符前的字符 `(`、`[` 和 `{` ;运算符后的字符 `)`、`]` 和 `}` 以及字符 `,`、`;` 和 `:` 都被视为空白。 以上规则需注意一点,如果预定义运算符 `!` 或 `?` 左侧没有空白,则不管右侧是否有空白都将被看作后缀运算符。如果将`?` 用作可选链(_optional-chaining_)操作符,左侧必须无空白。如果用于条件运算符 `? :`,必须两侧都有空白。 在某些特定的构造中 ,以 `<` 或 `>` 开头的运算符会被分离成两个或多个标记,剩余部分以同样的方式会被再次分离。因此,在 `Dictionary<String, Array<Int>>` 中没有必要添加空白来消除闭合字符 `>` 的歧义。在这个例子中, 闭合字符`>` 不会被视为单独的标记,因而不会被误解析为 `>>` 运算符的一部分。 要学习如何自定义运算符,请参考 [自定义操作符](http://wiki.jikexueyuan.com/project/swift/chapter2/25_Advanced_Operators.html#custom_operators) 和 [运算符声明](http://wiki.jikexueyuan.com/project/swift/chapter3/05_Declarations.html#operator_declaration)。要学习如何重载运算符,请参考 [运算符方法](http://wiki.jikexueyuan.com/project/swift/chapter2/25_Advanced_Operators.html#operator_functions)。 > 运算符语法语法 > _运算符_ → [_头部运算符_](http://wiki.jikexueyuan.com/project/swift/chapter3/02_Lexical_Structure.html#operator_head) [_运算符字符组_](http://wiki.jikexueyuan.com/project/swift/chapter3/02_Lexical_Structure.html#operator_characters)可选 > _运算符_ → [_头部点运算符_](http://wiki.jikexueyuan.com/project/swift/chapter3/02_Lexical_Structure.html#dot_operator_head) [_点运算符字符组_](http://wiki.jikexueyuan.com/project/swift/chapter3/02_Lexical_Structure.html#dot_operator_characters)可选 > > _头部运算符_ → / | = | + | ! |* | % | | > |& | | |/ | ~ | ? | _头部运算符_ → U+00A1–U+00A7 > _头部运算符_ → U+00A9 or U+00AB > _头部运算符_ → U+00AC or U+00AE > _头部运算符_ → U+00B0–U+00B1, U+00B6, U+00BB, U+00BF, U+00D7, or U+00F7 > _头部运算符_ → U+2016–U+2017 or 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+3030  > _运算符字符_ → [ _头部运算符_ ](http://wiki.jikexueyuan.com/project/swift/chapter3/02_Lexical_Structure.html#operator_head) > _运算符字符_ → U+0300–U+036F > _运算符字符_ → U+1DC0–U+1DFF > _运算符字符_ → U+20D0–U+20FF > _运算符字符_ → U+FE00–U+FE0F > _运算符字符_ → U+FE20–U+FE2F > _运算符字符_ → U+E0100–U+E01EF > > _运算符字符组_ → [ _运算符字符_ ](http://wiki.jikexueyuan.com/project/swift/chapter3/02_Lexical_Structure.html#operator_character)  _运算符字符组_ 可选 > > _头部点运算符_ → .. > _头部点运算符字符_ → . | [ _运算符字符_ ](http://wiki.jikexueyuan.com/project/swift/chapter3/02_Lexical_Structure.html#operator_character) > _头部点运算符字符组_ → [ _点运算符字符_ ](http://wiki.jikexueyuan.com/project/swift/chapter3/02_Lexical_Structure.html#dot_operator_character) [ _点运算符字符组_ ](http://wiki.jikexueyuan.com/project/swift/chapter3/02_Lexical_Structure.html#dot_operator_characters)可选 > > _二元运算符_ → [ _运算符_ ](http://wiki.jikexueyuan.com/project/swift/chapter3/02_Lexical_Structure.html#operator) > _前置运算符_ → [ _运算符_ ](http://wiki.jikexueyuan.com/project/swift/chapter3/02_Lexical_Structure.html#operator) > _后置运算符_ → [ _运算符_ ](http://wiki.jikexueyuan.com/project/swift/chapter3/02_Lexical_Structure.html#operator)
';