這里的教程為Swift官方教程中文版。

詞法結(jié)構(gòu)(Lexical Structure)

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

注釋 → // 注釋內(nèi)容 斷行符

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í)符

標(biāo)識(shí)符(identifier) 可以由以下的字符開始:大寫或小寫的字母 AZ、下劃線(_)、基本多文種平面(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)點(diǎn)符號(hào)

下面這些被保留的關(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,TypeProtocol 在顯式的成員表達(dá)式中具有特殊的含義,因此它們必須在該上下文中使用反引號(hào)進(jìn)行轉(zhuǎn)義。

  • 用在聲明中的關(guān)鍵字:associatedtypeclass、deinitenum、extension、fileprivatefunc、importinit、inout、internal、let、open、operatorprivate、protocolpublic、rethrowsstatic、struct、subscripttypealias 以及 var。
  • 用在語(yǔ)句中的關(guān)鍵字:break、case、continue、default、defer、doelse、fallthroughfor、guard、if、in、repeatreturn、switchwhere 以及 while。
  • 用在表達(dá)式和類型中的關(guān)鍵字:asAny、catch、falseis、nilsuper、selfSelf、throw、throws、true 以及 try。
  • 用在模式中的關(guān)鍵字:_
  • 以井字號(hào)(#)開頭的關(guān)鍵字:#available、#colorLiteral#column、#else#elseif、#endif、#error#file、#fileLiteral#function、#if#imageLiteral、#line#selector、#sourceLocation以及 #warning。
  • 特定上下文中被保留的關(guān)鍵字:associativity、convenience、dynamic、didSetfinal、getinfix、indirect、lazy、leftmutating、nonenonmutating、optional、overridepostfix、precedence、prefixProtocol、requiredright、setType、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ù)字面量

整數(shù)字面量(Integer Literals) 表示未指定精度的整數(shù)值。整數(shù)字面量默認(rèn)用十進(jìn)制表示;可以加前綴來指定其他的進(jìn)制。二進(jìn)制字面量加 0b,八進(jìn)制字面量加 0o,十六進(jìn)制字面量加 0x。

十進(jìn)制字面量包含數(shù)字 09。二進(jìn)制字面量包含 01,八進(jìn)制字面量包含數(shù)字 07,十六進(jìn)制字面量包含數(shù)字 09 以及字母 AF(大小寫均可)。

負(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ù)字面量

浮點(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ù) ee | E

floating-point-p

十六進(jìn)制指數(shù) pp | 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
  • 雙引號(hào) (\"
  • 單引號(hào) (\'
  • Unicode 標(biāo)量 (\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)行連接的。比如下面的 textAtextB 是完全一樣的,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)義序列 空白可選 斷行符

運(yù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é)如下:

  • 如果運(yùn)算符兩側(cè)都有空白或兩側(cè)都無空白,將被看作二元運(yùn)算符。例如:a+++ba +++ b 當(dāng)中的 +++ 運(yùn)算符會(huì)被看作二元運(yùn)算符。
  • 如果運(yùn)算符只有左側(cè)空白,將被看作一元前綴運(yùn)算符。例如 a +++b 中的 +++ 運(yùn)算符會(huì)被看做是一元前綴運(yùn)算符。
  • 如果運(yùn)算符只有右側(cè)空白,將被看作一元后綴運(yùn)算符。例如 a+++ b 中的 +++ 運(yùn)算符會(huì)被看作是一元后綴運(yùn)算符。
  • 如果運(yùn)算符左側(cè)沒有空白并緊跟 (.),將被看作一元后綴運(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)算符

? 關(guān)于語(yǔ)言參考 類型 ?
?