Swift 的“詞法結(jié)構(gòu)(lexical structure)” 描述了能構(gòu)成該語(yǔ)言中有效符號(hào)(token)的字符序列。這些合法符號(hào)組成了語(yǔ)言中最底層的構(gòu)建基塊,并在之后的章節(jié)中用于描述語(yǔ)言的其他部分。一個(gè)合法符號(hào)由一個(gè)標(biāo)識(shí)符(identifier)、關(guān)鍵字(keyword)、標(biāo)點(diǎn)符號(hào)(punctuation)、字面量(literal)或運(yùn)算符(operator)組成。
通常情況下,符號(hào)是考慮了輸入文本中最長(zhǎng)可能的子字符串,并被隨后將介紹的語(yǔ)法約束,根據(jù) Swift 源文件的字符生成的。這種方法稱為“最長(zhǎng)匹配(longest match)”,或者“最大適合(maximal munch)”。
空白(whitespace)有兩個(gè)用途:分隔源文件中的符號(hào)以及幫助區(qū)分運(yùn)算符屬于前綴還是后綴(參見 運(yùn)算符),在其他情況下空白則會(huì)被忽略。以下的字符會(huì)被當(dāng)作空白:空格(U+0020)、換行符(U+000A)、回車符(U+000D)、水平制表符(U+0009)、垂直制表符(U+000B)、換頁(yè)符(U+000C)以及空字符(U+0000)。
注釋被編譯器當(dāng)作空白處理。單行注釋由 //
開始直至遇到換行符(U+000A)或者回車符(U+000D)。多行注釋由 /*
開始,以 */
結(jié)束。多行注釋允許嵌套,但注釋標(biāo)記必須成對(duì)出現(xiàn)。
注釋可以包含其他的格式和標(biāo)記,如 標(biāo)記格式參考中所述。
空白語(yǔ)法
空白 → 空白項(xiàng) 空白可選
whitespace-item
空白項(xiàng) → 斷行符
空白項(xiàng) → 注釋
空白項(xiàng) → 多行注釋
空白項(xiàng) → U+0000,U+0009,U+000B,U+000C 或者 U+0020
line-break
斷行符 → U+000A
斷行符 → U+000D
斷行符 → U+000D 接著是 U+000A
comment
multiline-comment
多行注釋 →
/*
多行注釋內(nèi)容*/
comment-text
注釋內(nèi)容 → 注釋內(nèi)容項(xiàng) 注釋內(nèi)容可選
comment-text-item
注釋內(nèi)容項(xiàng) → 任何 Unicode 標(biāo)量值,除了 U+000A 或者 U+000D
multiline-commnet-text
多行注釋內(nèi)容 → 多行注釋內(nèi)容項(xiàng) 多行注釋內(nèi)容可選
多行注釋內(nèi)容項(xiàng) → 多行注釋.
多行注釋內(nèi)容項(xiàng) → 注釋內(nèi)容項(xiàng)
多行注釋內(nèi)容項(xiàng) → 任何 Unicode 標(biāo)量值,除了
/*
或者*/
標(biāo)識(shí)符(identifier) 可以由以下的字符開始:大寫或小寫的字母 A
到 Z
、下劃線(_
)、基本多文種平面(Basic Multilingual Plane)中非字符數(shù)字組合的 Unicode 字符以及基本多文種平面以外的非個(gè)人專用區(qū)字符。在首字符之后,允許使用數(shù)字和組合 Unicode 字符。
使用保留字作為標(biāo)識(shí)符,需要在其前后增加反引號(hào)(`
)。例如,class
不是合法的標(biāo)識(shí)符,但可以使用 `class`
。反引號(hào)不屬于標(biāo)識(shí)符的一部分,`x`
和 x
表示同一標(biāo)識(shí)符。
閉包中如果沒有明確指定參數(shù)名稱,參數(shù)將被隱式命名為 $0
、$1
、$2
等等。這些命名在閉包作用域范圍內(nèi)是合法的標(biāo)識(shí)符。
編譯器給含有屬性包裝器呈現(xiàn)值的屬性自動(dòng)合成以美元符號(hào)($)開頭的標(biāo)識(shí)符。你的代碼可以與這些標(biāo)識(shí)符進(jìn)行交互,,但是不能使用該前綴聲明標(biāo)識(shí)符。更詳細(xì)的介紹,請(qǐng)查看 特性 章節(jié)中的 屬性包裝器 部分。
標(biāo)識(shí)符語(yǔ)法
標(biāo)識(shí)符 → 頭部標(biāo)識(shí)符 標(biāo)識(shí)符字符組可選
標(biāo)識(shí)符 → `頭部標(biāo)識(shí)符 標(biāo)識(shí)符字符組可選`
標(biāo)識(shí)符 → 隱式參數(shù)名
標(biāo)識(shí)符列表 → 標(biāo)識(shí)符 | 標(biāo)識(shí)符 , 標(biāo)識(shí)符列表
identifier-head
頭部標(biāo)識(shí)符 → 大寫或小寫字母 A - Z
頭部標(biāo)識(shí)符 → _
頭部標(biāo)識(shí)符 → U+00A8,U+00AA,U+00AD,U+00AF,U+00B2–U+00B5,或者 U+00B7–U+00BA
頭部標(biāo)識(shí)符 → U+00BC–U+00BE,U+00C0–U+00D6,U+00D8–U+00F6,或者 U+00F8–U+00FF
頭部標(biāo)識(shí)符 → U+0100–U+02FF,U+0370–U+167F,U+1681–U+180D,或者 U+180F–U+1DBF
頭部標(biāo)識(shí)符 → U+1E00–U+1FFF
頭部標(biāo)識(shí)符 → U+200B–U+200D,U+202A–U+202E,U+203F–U+2040,U+2054,或者 U+2060–U+206F
頭部標(biāo)識(shí)符 → U+2070–U+20CF,U+2100–U+218F,U+2460–U+24FF,或者 U+2776–U+2793
頭部標(biāo)識(shí)符 → U+2C00–U+2DFF 或者 U+2E80–U+2FFF
頭部標(biāo)識(shí)符 → U+3004–U+3007,U+3021–U+302F,U+3031–U+303F,或者 U+3040–U+D7FF
頭部標(biāo)識(shí)符 → U+F900–U+FD3D,U+FD40–U+FDCF,U+FDF0–U+FE1F,或者 U+FE30–U+FE44
頭部標(biāo)識(shí)符 → U+FE47–U+FFFD
頭部標(biāo)識(shí)符 → U+10000–U+1FFFD,U+20000–U+2FFFD,U+30000–U+3FFFD,或者 U+40000–U+4FFFD
頭部標(biāo)識(shí)符 → U+50000–U+5FFFD,U+60000–U+6FFFD,U+70000–U+7FFFD,或者 U+80000–U+8FFFD
頭部標(biāo)識(shí)符 → U+90000–U+9FFFD,U+A0000–U+AFFFD,U+B0000–U+BFFFD,或者 U+C0000–U+CFFFD
頭部標(biāo)識(shí)符 → U+D0000–U+DFFFD 或者 U+E0000–U+EFFFD
identifier-character
標(biāo)識(shí)符字符 → 數(shù)值 0 - 9
標(biāo)識(shí)符字符 → U+0300–U+036F,U+1DC0–U+1DFF,U+20D0–U+20FF,或者 U+FE20–U+FE2F
標(biāo)識(shí)符字符 → 頭部標(biāo)識(shí)符
identifier-characters
標(biāo)識(shí)符字符組 → 標(biāo)識(shí)符字符 標(biāo)識(shí)符字符組可選
implicit-parameter-name
隱式參數(shù)名 → $ 十進(jìn)制數(shù)字列表
property-wrapper-projection
屬性包裝器呈現(xiàn)值 → $ 標(biāo)識(shí)符字符組
下面這些被保留的關(guān)鍵字不允許用作標(biāo)識(shí)符,除非使用反引號(hào)轉(zhuǎn)義,具體描述請(qǐng)參考 標(biāo)識(shí)符。除了 inout
、var
以及 let
之外的關(guān)鍵字可以用作某個(gè)函數(shù)聲明或者函數(shù)調(diào)用當(dāng)中的外部參數(shù)名,無需添加反引號(hào)轉(zhuǎn)義。當(dāng)一個(gè)成員與一個(gè)關(guān)鍵字具有相同的名稱時(shí),不需要使用反引號(hào)來轉(zhuǎn)義對(duì)該成員的引用,除非在引用該成員和使用該關(guān)鍵字之間存在歧義 - 例如,self
,Type
和 Protocol
在顯式的成員表達(dá)式中具有特殊的含義,因此它們必須在該上下文中使用反引號(hào)進(jìn)行轉(zhuǎn)義。
associatedtype
、class
、deinit
、enum
、extension
、fileprivate
、func
、import
、init
、inout
、internal
、let
、open
、operator
、private
、protocol
、public
、rethrows
、static
、struct
、subscript
、typealias
以及 var
。break
、case
、continue
、default
、defer
、do
、else
、fallthrough
、for
、guard
、if
、in
、repeat
、return
、switch
、where
以及 while
。as
、Any
、catch
、false
、is
、nil
、super
、self
、Self
、throw
、throws
、true
以及 try
。_
。#
)開頭的關(guān)鍵字:#available
、#colorLiteral
、#column
、#else
、#elseif
、#endif
、#error
、#file
、#fileLiteral
、#function
、#if
、#imageLiteral
、#line
、#selector
、#sourceLocation
以及 #warning
。associativity
、convenience
、dynamic
、didSet
、final
、get
、infix
、indirect
、lazy
、left
、mutating
、none
、nonmutating
、optional
、override
、postfix
、precedence
、prefix
、Protocol
、required
、right
、set
、Type
、unowned
、weak
以及 willSet
。這些關(guān)鍵字在特定上下文之外可以被用做標(biāo)識(shí)符。以下符號(hào)被保留為標(biāo)點(diǎn)符號(hào),不能用于自定義運(yùn)算符:(
、)
、{
、}
、[
、]
、.
、,
、:
、;
、=
、@
、#
、&
(作為前綴運(yùn)算符)、->
、`
、?
、以及 !
(作為后綴運(yùn)算符)。
字面量(literal) 用來表示源碼中某種特定類型的值,比如一個(gè)數(shù)字或字符串。
下面是字面量的一些示例:
42 // 整數(shù)字面量
3.14159 // 浮點(diǎn)數(shù)字面量
"Hello, world!" // 字符串字面量
true // 布爾值字面量
字面量本身并不包含類型信息。事實(shí)上,一個(gè)字面量會(huì)被解析為擁有無限的精度,然后 Swift 的類型推導(dǎo)會(huì)嘗試去推導(dǎo)出這個(gè)字面量的類型。比如,在 let x: Int8 = 42
這個(gè)聲明中,Swift 使用了顯式類型注解(: Int8
)來推導(dǎo)出 42
這個(gè)整數(shù)字面量的類型是 Int8
。如果沒有可用的類型信息,Swift 則會(huì)從標(biāo)準(zhǔn)庫(kù)中定義的字面量類型中推導(dǎo)出一個(gè)默認(rèn)的類型。整數(shù)字面量的默認(rèn)類型是 Int
,浮點(diǎn)數(shù)字面量的默認(rèn)類型是 Double
,字符串字面量的默認(rèn)類型是 String
,布爾值字面量的默認(rèn)類型是 Bool
。比如,在 let str = "Hello, world"
這個(gè)聲明中,字符串 "Hello, world"
的默認(rèn)推導(dǎo)類型就是 String
。
當(dāng)為一個(gè)字面量值指定了類型注解的時(shí)候,這個(gè)注解類型必須能通過這個(gè)字面量值實(shí)例化。也就是說,這個(gè)類型必須符合這些 Swift 標(biāo)準(zhǔn)庫(kù)協(xié)議中的一個(gè):整數(shù)字面量的 ExpressibleByIntegerLiteral
協(xié)議、浮點(diǎn)數(shù)字面量的 ExpressibleByFloatLiteral
協(xié)議、字符串字面量的 ExpressibleByStringLiteral
協(xié)議、布爾值字面量的 ExpressibleByBooleanLiteral
協(xié)議、只包含單個(gè) Unicode 標(biāo)量字符串文本的 ExpressibleByUnicodeScalarLiteral
協(xié)議以及只包含單個(gè)擴(kuò)展字形簇(grapheme cluster)字符串文字的 ExpressibleByExtendedGraphemeClusterLiteral
協(xié)議。比如,Int8
符合 ExpressibleByIntegerLiteral
協(xié)議,因此它能在 let x: Int8 = 42
這個(gè)聲明中作為整數(shù)字面量 42
的類型注解。
字面量語(yǔ)法
字面量 → 數(shù)值字面量 | 字符串字面量 | 布爾值字面量 | nil 字面量
數(shù)值字面量 → -可選 整數(shù)字面量 | -可選 浮點(diǎn)數(shù)字面量
布爾值字面量 → true | false
nil 字面量 → nil
整數(shù)字面量(Integer Literals) 表示未指定精度的整數(shù)值。整數(shù)字面量默認(rèn)用十進(jìn)制表示;可以加前綴來指定其他的進(jìn)制。二進(jìn)制字面量加 0b
,八進(jìn)制字面量加 0o
,十六進(jìn)制字面量加 0x
。
十進(jìn)制字面量包含數(shù)字 0
至 9
。二進(jìn)制字面量包含 0
和 1
,八進(jìn)制字面量包含數(shù)字 0
至 7
,十六進(jìn)制字面量包含數(shù)字 0
至 9
以及字母 A
至 F
(大小寫均可)。
負(fù)整數(shù)字面量的表示方式為在整數(shù)字面量前加負(fù)號(hào) -
,比如 -42
。
整型字面面可以使用下劃線(_
)來增加數(shù)字的可讀性,下劃線會(huì)被系統(tǒng)忽略,因此不會(huì)影響字面量的值。同樣地,也可以在數(shù)字前加 0
,這同樣也會(huì)被系統(tǒng)所忽略,并不會(huì)影響字面量的值。
除非特別指定,整數(shù)字面量的默認(rèn)推導(dǎo)類型為 Swift 標(biāo)準(zhǔn)庫(kù)類型中的 Int
。Swift 標(biāo)準(zhǔn)庫(kù)還定義了其他不同長(zhǎng)度以及是否帶符號(hào)的整數(shù)類型,請(qǐng)參考 整數(shù)。
整數(shù)字面量語(yǔ)法
integer-literal
整數(shù)字面量 → 二進(jìn)制字面量
整數(shù)字面量 → 八進(jìn)制字面量
整數(shù)字面量 → 十進(jìn)制字面量
整數(shù)字面量 → 十六進(jìn)制字面量
binary-literal
二進(jìn)制字面量 → 0b 二進(jìn)制數(shù)字 二進(jìn)制字面量字符組可選
binary-digit
二進(jìn)制數(shù)字 → 數(shù)值 0 或 1
二進(jìn)制字面量字符 → 二進(jìn)制數(shù)字 | _
binary-literal-characters
二進(jìn)制字面量字符組 → 二進(jìn)制字面量字符 二進(jìn)制字面量字符組可選
octal-literal
八進(jìn)制字面量 → 0o 八進(jìn)字?jǐn)?shù)字 八進(jìn)制字符組可選
octal-digit
八進(jìn)字?jǐn)?shù)字 → 數(shù)值 0 到 7
八進(jìn)制字符 → 八進(jìn)字?jǐn)?shù)字 | _
octal-literal-characters
八進(jìn)制字符組 → 八進(jìn)制字符 八進(jìn)制字符組可選
decimal-literal
十進(jìn)制字面量 → 十進(jìn)制數(shù)字 十進(jìn)制字符組可選
decimal-digit
十進(jìn)制數(shù)字 → 數(shù)值 0 到 9
decimal-literal-characters
十進(jìn)制數(shù)字組 → 十進(jìn)制數(shù)字 十進(jìn)制數(shù)字組可選
十進(jìn)制字符 → 十進(jìn)制數(shù)字 | _
十進(jìn)制字符組 → 十進(jìn)制字符 十進(jìn)制字符組可選
hexadecimal-literal
十六進(jìn)制字面量 → 0x 十六進(jìn)制數(shù)字 十六進(jìn)制字面量字符組可選
hexadecimal-digit
十六進(jìn)制數(shù)字 → 數(shù)值 0 到 9, 字母 a 到 f, 或 A 到 F
十六進(jìn)制字符 → 十六進(jìn)制數(shù)字 | -
hexadecimal-literal-characters
十六進(jìn)制字面量字符組 → 十六進(jìn)制字符 十六進(jìn)制字面量字符組可選
浮點(diǎn)數(shù)字面量(Floating-point literals)表示未指定精度浮點(diǎn)數(shù)的值。
浮點(diǎn)數(shù)字面量默認(rèn)用十進(jìn)制表示(無前綴),也可以用十六進(jìn)制表示(加前綴 0x
)。
十進(jìn)制浮點(diǎn)數(shù)字面量由十進(jìn)制數(shù)字串后跟十進(jìn)制小數(shù)部分或十進(jìn)制指數(shù)部分(或兩者皆有)組成。十進(jìn)制小數(shù)部分由小數(shù)點(diǎn)(.
)后跟十進(jìn)制數(shù)字串組成。指數(shù)部分由大寫或小寫字母 e
為前綴后跟十進(jìn)制數(shù)字串組成,這串?dāng)?shù)字表示 e
之前的數(shù)值乘以 10 的幾次方。例如:1.25e2
表示 1.25 x 102,也就是 125.0
。同樣,1.25e-2
表示 1.25 x 10ˉ2,也就是 0.0125
。
十六進(jìn)制浮點(diǎn)數(shù)字面量由前綴 0x
后跟可選的十六進(jìn)制小數(shù)部分以及十六進(jìn)制指數(shù)部分組成。十六進(jìn)制小數(shù)部分由小數(shù)點(diǎn)后跟十六進(jìn)制數(shù)字串組成。指數(shù)部分由大寫或小寫字母 p
為前綴后跟十進(jìn)制數(shù)字串組成,這串?dāng)?shù)字表示 p
之前的數(shù)量乘以 2 的幾次方。例如:0xFp2
表示 15 x 22,也就是 60
。同樣,0xFp-2
表示 15 x 2ˉ2,也就是 3.75
。
負(fù)數(shù)的浮點(diǎn)數(shù)字面量由負(fù)號(hào)(-
)和浮點(diǎn)數(shù)字面量組成,例如 -42.5
。
浮點(diǎn)數(shù)字面量允許使用下劃線(_
)來增強(qiáng)數(shù)字的可讀性,下劃線會(huì)被系統(tǒng)忽略,因此不會(huì)影響字面量的值。同樣地,也可以在數(shù)字前加 0
,并不會(huì)影響字面量的值。
除非特別指定,浮點(diǎn)數(shù)字面量的默認(rèn)推導(dǎo)類型為 Swift 標(biāo)準(zhǔn)庫(kù)類型中的 Double
,表示 64 位浮點(diǎn)數(shù)。Swift 標(biāo)準(zhǔn)庫(kù)也定義了 Float
類型,表示 32 位浮點(diǎn)數(shù)。
浮點(diǎn)數(shù)字面量語(yǔ)法
floating-point-literal
浮點(diǎn)數(shù)字面量 → 十進(jìn)制字面量 十進(jìn)制分?jǐn)?shù)可選 十進(jìn)制指數(shù)可選
浮點(diǎn)數(shù)字面量 → 十六進(jìn)制字面量 十六進(jìn)制分?jǐn)?shù)可選 十六進(jìn)制指數(shù)
decimal-fraction
十進(jìn)制分?jǐn)?shù) → . 十進(jìn)制字面量
decimal-exponent
十進(jìn)制指數(shù) → 十進(jìn)制指數(shù) e 正負(fù)號(hào)可選 十進(jìn)制字面量
hexadecimal-fraction
十六進(jìn)制分?jǐn)?shù) → . 十六進(jìn)制數(shù)字 十六進(jìn)制字面量字符組可選
hexadecimal-exponent
十六進(jìn)制指數(shù) → 十六進(jìn)制指數(shù) p 正負(fù)號(hào)可選 十進(jìn)制字面量
floating-point-e
十進(jìn)制指數(shù) e → e | E
floating-point-p
十六進(jìn)制指數(shù) p → p | P
sign
正負(fù)號(hào) → + | -
字符串字面量是被引號(hào)包括的一串字符組成。單行字符串字面量是被包在雙引號(hào)中的一串字符組成,形式如下:
"
字符
"
字符串字面量中不能包含未轉(zhuǎn)義的雙引號(hào)("
)、未轉(zhuǎn)義的反斜線(\
)、回車符、換行符。
多行字符串字面量被包在三個(gè)雙引號(hào)中的一串字符組成,形式如下:
"""
字符
"""
與單行字符串字面量不同的是,多行字符串字面量可以包含不轉(zhuǎn)義的雙引號(hào)("),回車以及換行。它不能包含三個(gè)未轉(zhuǎn)義的連續(xù)雙引號(hào)。
"""
之后的回車或者換行開始多行字符串字面量,它們不是字符串的一部分。結(jié)束部分的 """
以及它之前的回車或者換行,也不是字符串的一部分。要讓多行字符串字面量的開始或結(jié)束帶有換行,就在第一行或者最后一行寫一個(gè)空行。
多行字符串字面量可以使用任何空格或制表符組合進(jìn)行縮進(jìn);這些縮進(jìn)不會(huì)包含在字符串中。"""
的結(jié)束符號(hào)決定了縮進(jìn):字面量中的每一個(gè)非空行開頭都必須與結(jié)束符 """
之前出現(xiàn)的縮進(jìn)完全一致;空格和制表符不會(huì)被轉(zhuǎn)換。你可以在縮進(jìn)后包含額外的空格和制表符;這些空格和制表符會(huì)在字符串中出現(xiàn)。
多行字符串字面量中的一行結(jié)束使用規(guī)范化的換行符號(hào)。盡管你的源代碼混用了回車和換行符,字符串中所有的行結(jié)束都必須一樣.
在多行字符串字面量里,在行末用反斜線(\
)可以省略字符串行間中斷。反斜線和換行符之間的空白也將被忽略。你可以在你的代碼里用這種語(yǔ)法硬包裹多行字符串字面量,而不改變結(jié)果字符串的值。
可以在字符串字面量中使用的轉(zhuǎn)義特殊符號(hào)如下:
\0
)\\
)\t
)\n
)\r
)\"
)\'
)\u{
n}
),n 為一到八位的十六進(jìn)制數(shù)字字符串字面量允許在反斜杠(\
)后的括號(hào) ()
中插入表達(dá)式的值。插入表達(dá)式可以包含字符串字面量,但不能包含未轉(zhuǎn)義的反斜線(\
)、回車符以及換行符。
例如,以下所有字符串字面量的值都是相同的:
"1 2 3"
"1 2 \("3")"
"1 2 \(3)"
"1 2 \(1 + 2)"
let x = 3; "1 2 \(x)"
由擴(kuò)展分隔符包裹的字符串,它是由引號(hào)以及成對(duì)出現(xiàn)的數(shù)字符號(hào)(#
)包裹的字符串序列。由擴(kuò)展分隔符包裹的字符串形式如下所示:
#"
characters
"##"""
characters
"""#
特殊字符在被擴(kuò)展分隔符分隔的結(jié)果字符串中會(huì)展示為普通字符,而不是特殊字符。你可以使用擴(kuò)展分隔符來創(chuàng)建一些通常情況下具有特殊效果的字符串。例如,生成字符串插值,啟動(dòng)轉(zhuǎn)義序列或終止字符串。
以下所示,由字符串字面量和擴(kuò)展分隔符所創(chuàng)建的字符串是等價(jià)的:
let string = #"\(x) \ " \u{2603}"#
let escaped = "\\(x) \\ \" \\u{2603}"
print(string)
// Prints "\(x) \ " \u{2603}"
print(string == escaped)
// Prints "true"
如果在一個(gè)字符串中使用多對(duì)擴(kuò)展分隔符,請(qǐng)不要在分隔符之間使用空格。
print(###"Line 1\###nLine 2"###) // OK
print(# # #"Line 1\# # #nLine 2"# # #) // Error
使用擴(kuò)展分隔符創(chuàng)建的多行字符串字面量與普通多行字符串字面量具有相同的縮進(jìn)要求。
字符串字面量的默認(rèn)推導(dǎo)類型為 String
。更多有關(guān) String
類型的信息請(qǐng)參考 字符串和字符 以及 字符串結(jié)構(gòu)參考。
用 +
操作符連接的字符型字面量是在編譯時(shí)進(jìn)行連接的。比如下面的 textA
和 textB
是完全一樣的,textA
沒有任何運(yùn)行時(shí)的連接操作。
let textA = "Hello " + "world"
let textB = "Hello world"
字符串字面量語(yǔ)法
字符串字面量 → 靜態(tài)字符串字面量 | 插值字符串字面量
字符串開分隔定界符 → 字符串?dāng)U展分隔符 "
字符串閉分隔定界符 → " 字符串?dāng)U展分隔符可選
static-string-literal
靜態(tài)字符串字面量 → 字符串開分隔定界符 引用文本可選 字符串閉分隔定界符
靜態(tài)字符串字面量 → 多行字符串開分隔定界符 多行引用文本可選 多行字符串閉分隔定界符
多行字符串開分隔定界符 → 字符串?dāng)U展分隔符 """
多行字符串閉分隔定界符 → """ 字符串?dāng)U展分隔符
extended-string-literal-delimiter
字符串?dāng)U展分隔符 → # 字符串?dāng)U展分隔符可選
quoted-text
引用文本 → 引用文本項(xiàng) 引用文本可選
quoted-text-item
引用文本項(xiàng) → 轉(zhuǎn)義字符
引用文本項(xiàng) → 除了 "、\、U+000A、U+000D 以外的所有 Unicode 字符
multiline-quoted-text
多行引用文本 → 多行引用文本項(xiàng) 多行引用文本可選
multiline-quoted-text-item
多行引用文本項(xiàng) 轉(zhuǎn)義字符可選
multiline-quoted-text
多行引用文本 → 除了 \ 以外的任何 Unicode 標(biāo)量值
多行引用文本 → 轉(zhuǎn)義換行
interpolated-string-literal
插值字符串字面量 → 字符串開分隔定界符 插值文本可選 字符串閉分隔定界符
插值字符串字面量 → 多行字符串開分隔定界符 插值文本可選 多行字符串閉分隔定界符
interpolated-text
插值文本 → 插值文本項(xiàng) 插值文本可選
interpolated-text-item
插值文本項(xiàng) → \( 表達(dá)式 ) | 引用文本項(xiàng)
多行插值文本 → 多行插值文本項(xiàng) 多行插值文本可選
多行插值文本項(xiàng) → \( 表達(dá)式 ) | 多行引用文本項(xiàng)
escape-sequence
轉(zhuǎn)義序列 → \ 字符串?dāng)U展分隔符
escaped-character
轉(zhuǎn)義字符 → 轉(zhuǎn)義序列 0 | 轉(zhuǎn)義序列 \ | 轉(zhuǎn)義序列 t | 轉(zhuǎn)義序列 n | 轉(zhuǎn)義序列 r | 轉(zhuǎn)義序列 \" | 轉(zhuǎn)義序列 '
轉(zhuǎn)義字符 → 轉(zhuǎn)義序列 u { unicode 標(biāo)量數(shù)字 }
unicode-scalar-digits
unicode 標(biāo)量數(shù)字 → 一到八位的十六進(jìn)制數(shù)字
escaped-newline
轉(zhuǎn)義換行符 → 轉(zhuǎn)義序列 空白可選 斷行符
Swift 標(biāo)準(zhǔn)庫(kù)定義了許多可供使用的運(yùn)算符,其中大部分在 基礎(chǔ)運(yùn)算符 和 高級(jí)運(yùn)算符 中進(jìn)行了闡述。這一小節(jié)將描述哪些字符能用于自定義運(yùn)算符。
自定義運(yùn)算符可以由以下其中之一的 ASCII 字符 /
、=
、-
、+
、!
、*
、%
、<
、>
、&
、|
、^
、?
以及 ~
,或者后面語(yǔ)法中規(guī)定的任一個(gè) Unicode 字符(其中包含了數(shù)學(xué)運(yùn)算符、零散符號(hào)(Miscellaneous Symbols) 以及印刷符號(hào)(Dingbats)之類的 Unicode 塊)開始。在第一個(gè)字符之后,允許使用組合型 Unicode 字符。
您也可以以點(diǎn)號(hào)(.
)開頭來定義自定義運(yùn)算符。這些運(yùn)算符可以包含額外的點(diǎn)。例如 .+.
會(huì)被看作一個(gè)單獨(dú)的運(yùn)算符。如果某個(gè)運(yùn)算符不是以點(diǎn)號(hào)開頭的,那么它就無法再包含另外的點(diǎn)號(hào)了。例如,+.+
就會(huì)被看作為一個(gè) +
運(yùn)算符后面跟著一個(gè) .+
運(yùn)算符。
雖然您可以用問號(hào) (?)
來自定義運(yùn)算符,但是這個(gè)運(yùn)算符不能只包含單獨(dú)的一個(gè)問號(hào)。此外,雖然運(yùn)算符可以包含一個(gè)驚嘆號(hào) (!)
,但是前綴運(yùn)算符不能夠以問號(hào)或者驚嘆號(hào)開頭。
注意
以下這些標(biāo)記
=
、->
、//
、/*
、*/
、.
,前綴運(yùn)算符<
、&
和?
,中綴運(yùn)算符?
,后綴運(yùn)算符>
、!
和?
是被系統(tǒng)保留的。這些符號(hào)不能被重載,也不能用作自定義運(yùn)算符。
運(yùn)算符兩側(cè)的空白被用來區(qū)分該運(yùn)算符是否為前綴運(yùn)算符、后綴運(yùn)算符或二元運(yùn)算符。規(guī)則總結(jié)如下:
a+++b
和 a +++ b
當(dāng)中的 +++
運(yùn)算符會(huì)被看作二元運(yùn)算符。a +++b
中的 +++
運(yùn)算符會(huì)被看做是一元前綴運(yùn)算符。a+++ b
中的 +++
運(yùn)算符會(huì)被看作是一元后綴運(yùn)算符。(.)
,將被看作一元后綴運(yùn)算符。例如 a+++.b
中的 +++
運(yùn)算符會(huì)被視為一元后綴運(yùn)算符(即上式被視為 a+++ .b
而不是 a +++ .b
)。鑒于這些規(guī)則,(
、[
和 {
是在運(yùn)算符前面,)
、]
和 }
是在運(yùn)算符后面,以及字符 ,
、;
和 :
都被視為空白。
以上規(guī)則需注意一點(diǎn)。如果預(yù)定義運(yùn)算符 !
或 ?
左側(cè)沒有空白,則不管右側(cè)是否有空白都將被看作后綴運(yùn)算符。如果將 ?
用作可選鏈?zhǔn)秸{(diào)用運(yùn)算符,左側(cè)必須無空白。如果用于條件運(yùn)算符 (? :)
,必須兩側(cè)都有空白。
在某些特定的設(shè)計(jì)中,以 <
或 >
開頭的運(yùn)算符會(huì)被分離成兩個(gè)或多個(gè)符號(hào)。剩余部分可能會(huì)以同樣的方式被再次分離。因此,在 Dictionary<String, Array<Int>>
中沒有必要添加空白來消除閉合字符 >
的歧義。在這個(gè)例子中,閉合字符 >
不會(huì)被視為單獨(dú)的符號(hào),因而不會(huì)被錯(cuò)誤解析為 >>
運(yùn)算符。
要學(xué)習(xí)如何自定義運(yùn)算符,請(qǐng)參考 自定義運(yùn)算符 和 運(yùn)算符聲明。要學(xué)習(xí)如何重載運(yùn)算符,請(qǐng)參考 運(yùn)算符函數(shù)。
運(yùn)算符語(yǔ)法
運(yùn)算符 → 頭部運(yùn)算符 運(yùn)算符字符組可選
運(yùn)算符 → 頭部點(diǎn)運(yùn)算符 點(diǎn)運(yùn)算符字符組
operator-head
頭部運(yùn)算符 → / | = | - | + | ! | * | % | < | > | & | | | ^ | ~ | ?
頭部運(yùn)算符 → U+00A1–U+00A7
頭部運(yùn)算符 → U+00A9 或 U+00AB
頭部運(yùn)算符 → U+00AC 或 U+00AE
頭部運(yùn)算符 → U+00B0–U+00B1
頭部運(yùn)算符 → U+00B6,U+00BB,U+00BF,U+00D7,或 U+00F7
頭部運(yùn)算符 → U+2016–U+2017
頭部運(yùn)算符 → U+2020–U+2027
頭部運(yùn)算符 → U+2030–U+203E
頭部運(yùn)算符 → U+2041–U+2053
頭部運(yùn)算符 → U+2055–U+205E
頭部運(yùn)算符 → U+2190–U+23FF
頭部運(yùn)算符 → U+2500–U+2775
頭部運(yùn)算符 → U+2794–U+2BFF
頭部運(yùn)算符 → U+2E00–U+2E7F
頭部運(yùn)算符 → U+3001–U+3003
頭部運(yùn)算符 → U+3008–U+3020
頭部運(yùn)算符 → U+3030
operator-character
運(yùn)算符字符 → 頭部運(yùn)算符
運(yùn)算符字符 → U+0300–U+036F
運(yùn)算符字符 → U+1DC0–U+1DFF
運(yùn)算符字符 → U+20D0–U+20FF
運(yùn)算符字符 → U+FE00–U+FE0F
運(yùn)算符字符 → U+FE20–U+FE2F
運(yùn)算符字符 → U+E0100–U+E01EF
operator-characters
運(yùn)算符字符組 → 運(yùn)算符字符 運(yùn)算符字符組可選
dot-operator-head
頭部點(diǎn)運(yùn)算符 → .
dot-operator-character
點(diǎn)運(yùn)算符字符 → . | 運(yùn)算符字符
dot-operator-characters
點(diǎn)運(yùn)算符字符組 → 點(diǎn)運(yùn)算符字符 點(diǎn)運(yùn)算符字符組可選
二元運(yùn)算符 → 運(yùn)算符
前綴運(yùn)算符 → 運(yùn)算符
后綴運(yùn)算符 → 運(yùn)算符