Swift 的“詞法結(jié)構(gòu)(lexical structure)”描述了如何在該語言中用字符序列構(gòu)建合法標(biāo)記,組成該語言中最底層的代碼塊番官,并在之后的章節(jié)中用于描述語言的其他部分庐完。
通常,標(biāo)記在隨后介紹的語法約束下徘熔,由 Swift 源文件的輸入文本中提取可能的最長(zhǎng)子串生成门躯。這種方法稱為“最長(zhǎng)匹配項(xiàng)(longest match)”,或者“最大適合”(maximal munch)近顷。
空白與注釋
空白(whitespace)有兩個(gè)用途:分隔源文件中的標(biāo)記和區(qū)分運(yùn)算符屬于前綴還是后綴生音,(參見 運(yùn)算符)在其他情況下則會(huì)被忽略。以下的字符會(huì)被當(dāng)作空白:空格(space)(U+0020)窒升、換行符(line feed)(U+000A)缀遍、回車符(carriage return)(U+000D)、水平 tab(horizontal tab)(U+0009)饱须、垂直 tab(vertical tab)(U+000B)域醇、換頁符(form feed)(U+000C)以及空(null)(U+0000)。
注釋(comments)被編譯器當(dāng)作空白處理蓉媳。單行注釋由 // 開始直到該行結(jié)束譬挚。多行注釋由 /* 開始,以 */ 結(jié)束酪呻”苫剩可以嵌套注釋鸭廷,但注意注釋標(biāo)記必須匹配。
作為一個(gè)開發(fā)者,有一個(gè)學(xué)習(xí)的氛圍跟一個(gè)交流圈子特別重要柬赐,這是一個(gè)我的iOS開發(fā)交流群:130 595 548移袍,不管你是小白還是大牛都?xì)g迎入駐 润绵,讓我們一起進(jìn)步葫慎,共同發(fā)展!(群內(nèi)會(huì)免費(fèi)提供一些群主收藏的免費(fèi)學(xué)習(xí)書籍資料以及整理好的幾百道面試題和答案文檔E印)
標(biāo)識(shí)符
標(biāo)識(shí)符(identifiers)可以由以下的字符開始:大寫或小寫的字母 A 到 Z填具、下劃線 _、基本多語言面(Basic Multilingual Plane)中的 Unicode 非組合字符以及基本多語言面以外的非專用區(qū)(Private Use Area)字符匆骗。首字符之后劳景,標(biāo)識(shí)符允許使用數(shù)字和 Unicode 字符組合。
使用保留字(reserved word)作為標(biāo)識(shí)符碉就,需要在其前后增加反引號(hào) 枢泰。例如,class 不是合法的標(biāo)識(shí)符铝噩,但可以使用
class衡蚂。反引號(hào)不屬于標(biāo)識(shí)符的一部分窿克,
x` 和 x 表示同一標(biāo)識(shí)符。
閉包(closure)中如果沒有明確指定參數(shù)名稱毛甲,參數(shù)將被隱式命名為 1、$2... 這些命名在閉包作用域內(nèi)是合法的標(biāo)識(shí)符玻募。
標(biāo)識(shí)符語法
identifier → identifier-head- identifier-characters- opt
identifier →- [identifier-head-](https://developer.apple.com/library/prerelease/ios/documentation/Swift/Conceptual/Swift_Programming_Language/LexicalStructure.html#//apple_ref/swift/grammar/identifier-head) [identifier-characters-](https://developer.apple.com/library/prerelease/ios/documentation/Swift/Conceptual/Swift_Programming_Language/LexicalStructure.html#//apple_ref/swift/grammar/identifier-characters) opt-
-
identifier → implicit-parameter-name-
identifier-list → identifier- | identifier- , -identifier-list-
identifier-head → A 到 Z 大寫或小寫字母
identifier-head → U+00A8, U+00AA, U+00AD, U+00AF, U+00B2–U+00B5, 或 U+00B7–U+00BA
identifier-head → U+00BC–U+00BE, U+00C0–U+00D6, U+00D8–U+00F6, 或 U+00F8–U+00FF
identifier-head → U+0100–U+02FF, U+0370–U+167F, U+1681–U+180D, 或 U+180F–U+1DBF
identifier-head → U+1E00–U+1FFF
identifier-head → U+200B–U+200D, U+202A–U+202E, U+203F–U+2040, U+2054, 或 U+2060–U+206F
identifier-head → U+2070–U+20CF, U+2100–U+218F, U+2460–U+24FF, 或 U+2776–U+2793
identifier-head → U+2C00–U+2DFF 或 U+2E80–U+2FFF
identifier-head → U+3004–U+3007, U+3021–U+302F, U+3031–U+303F, 或 U+3040–U+D7FF
identifier-head → U+F900–U+FD3D, U+FD40–U+FDCF, U+FDF0–U+FE1F, 或 U+FE30–U+FE44
identifier-head → U+FE47–U+FFFD
identifier-head → U+10000–U+1FFFD, U+20000–U+2FFFD, U+30000–U+3FFFD, 或 U+40000–U+4FFFD
identifier-head → U+50000–U+5FFFD, U+60000–U+6FFFD, U+70000–U+7FFFD, 或 U+80000–U+8FFFD
identifier-head → U+90000–U+9FFFD, U+A0000–U+AFFFD, U+B0000–U+BFFFD, 或 U+C0000–U+CFFFD
identifier-head → U+D0000–U+DFFFD 或 U+E0000–U+EFFFD
identifier-character → 數(shù)字 0 到 9
identifier-character → U+0300–U+036F, U+1DC0–U+1DFF, U+20D0–U+20FF, or U+FE20–U+FE2F
identifier-character → identifier-head-
identifier-characters → identifier-character -identifier-characters- opt-
implicit-parameter-name → $- decimal-digits-
關(guān)鍵字
被保留的關(guān)鍵字(keywords)不允許用作標(biāo)識(shí)符只损,除非被反引號(hào)轉(zhuǎn)義,參見 標(biāo)識(shí)符七咧。
- 用作聲明的關(guān)鍵字:class跃惫、deinit、enum艾栋、extension爆存、func、import蝗砾、init先较、let、protocol悼粮、static闲勺、struct、subscript扣猫、typealias菜循、var
- 用作語句的關(guān)鍵字: break、case申尤、continue癌幕、default、do瀑凝、else序芦、fallthrough臭杰、if粤咪、in、for渴杆、return寥枝、switch、where磁奖、while
- 用作表達(dá)和類型的關(guān)鍵字:as囊拜、dynamicType、is比搭、new冠跷、super、self、Self蜜托、Type抄囚、COLUMN、FILE橄务、FUNCTION幔托、LINE
- 特定上下文中被保留的關(guān)鍵字:associativity、didSet蜂挪、get重挑、infix、inout棠涮、left谬哀、mutating、none故爵、nonmutating玻粪、operator、override诬垂、postfix劲室、precedence、prefix结窘、right很洋、set、unowned隧枫、unowned(safe)喉磁、unowned(unsafe)、weak官脓、willSet协怒,這些關(guān)鍵字在特定上下文之外可以被用于標(biāo)識(shí)符。
字面量
字面值表示整型卑笨、浮點(diǎn)型數(shù)字或文本類型的值孕暇,舉例如下:
1. 42 // 整型字面量
2. 3.14159 // 浮點(diǎn)型字面量
3. "Hello, world!" // 文本型字面量
字面量語法
literal → integer-literal- | floating-point-literal- | string-literal-
整型字面量
整型字面量(integer literals)表示未指定精度整型數(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ù)字前加減號(hào) -,比如 -42承二。
允許使用下劃線 _ 來增加數(shù)字的可讀性搏存,下劃線不會(huì)影響字面量的值。整型字面量也可以在數(shù)字前加 0矢洲,同樣不會(huì)影響字面量的值璧眠。
1. 1000_000 // 等于 1000000
2. 005 // 等于 5
除非特殊指定,整型字面量的默認(rèn)類型為 Swift 標(biāo)準(zhǔn)庫類型中的 Int读虏。Swift 標(biāo)準(zhǔn)庫還定義了其他不同長(zhǎng)度以及是否帶符號(hào)的整數(shù)類型责静,請(qǐng)參考 整數(shù)類型。
整型字面量語法
integer-literal → binary-literal-
integer-literal → octal-literal-
integer-literal → decimal-literal-
integer-literal → hexadecimal-literal-
binary-literal → 0b- binary-digit -binary-literal-characters- opt-
binary-digit → 數(shù)字 0 或 1
binary-literal-character → binary-digit- | _-
binary-literal-characters → binary-literal-character -binary-literal-characters- opt-
octal-literal → 0o- octal-digit -octal-literal-characters- opt-
octal-digit → 數(shù)字 0 至 7
octal-literal-character → octal-digit- | _-
octal-literal-characters → octal-literal-character -octal-literal-characters- opt-
decimal-literal → decimal-digit -decimal-literal-characters- opt-
decimal-digit → 數(shù)字 0 至 9
decimal-digits → decimal-digit- decimal-digits- opt-
decimal-literal-character → decimal-digit- | _-
decimal-literal-characters → decimal-literal-character -decimal-literal-characters- opt-
hexadecimal-literal → 0x -hexadecimal-digit -hexadecimal-literal-characters- opt-
hexadecimal-digit → 數(shù)字 0 到 9, a 到 f, 或 A 到 F
hexadecimal-literal-character → hexadecimal-digit- | _-
hexadecimal-literal-characters → hexadecimal-literal-character- hexadecimal-literal-characters -opt-
浮點(diǎn)型字面量
浮點(diǎn)型字面量(floating-point literals)表示未指定精度浮點(diǎn)數(shù)的值盖桥。
浮點(diǎn)型字面量默認(rèn)用十進(jìn)制表示(無前綴)灾螃,也可以用十六進(jìn)制表示(加前綴 0x)。
十進(jìn)制浮點(diǎn)型字面量(decimal floating-point literals)由十進(jìn)制數(shù)字串后跟小數(shù)部分或指數(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 ? 10^2熄赡,也就是 125.0;同樣齿税,1.25e-2 表示 1.25 ? 10^-2彼硫,也就是 0.0125。
十六進(jìn)制浮點(diǎn)型字面量(hexadecimal floating-point literals)由前綴 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 ? 2^2串绩,也就是 60;同樣芜壁,0xFp-2 表示 15 ? 2^-2礁凡,也就是 3.75。
與整型字面量不同沿盅,負(fù)的浮點(diǎn)型字面量由一元運(yùn)算符減號(hào) - 和浮點(diǎn)型字面量組成把篓,例如 -42.0纫溃。這代表一個(gè)表達(dá)式腰涧,而不是一個(gè)浮點(diǎn)整型字面量。
允許使用下劃線 _ 來增強(qiáng)可讀性紊浩,下劃線不會(huì)影響字面量的值窖铡。浮點(diǎn)型字面量也可以在數(shù)字前加 0疗锐,同樣不會(huì)影響字面量的值。
1. 10_000.56 // 等于 10000.56
2. 005000.76 // 等于 5000.76
除非特殊指定费彼,浮點(diǎn)型字面量的默認(rèn)類型為 Swift 標(biāo)準(zhǔn)庫類型中的 Double滑臊,表示64位浮點(diǎn)數(shù)。Swift 標(biāo)準(zhǔn)庫也定義 Float 類型箍铲,表示32位浮點(diǎn)數(shù)雇卷。
浮點(diǎn)型字面量語法
floating-point-literal → decimal-literal -decimal-fraction- opt -decimal-exponent- opt-
floating-point-literal → hexadecimal-literal -hexadecimal-fraction -opt- hexadecimal-exponent-
decimal-fraction → . -decimal-literal-
decimal-exponent → floating-point-e -sign- opt- decimal-literal-
hexadecimal-fraction → . -hexadecimal-literal- opt-
hexadecimal-exponent → floating-point-p- sign- opt- hexadecimal-literal-
floating-point-e → e- | E-
floating-point-p → p- | P-
sign → +- | --
文本型字面量
文本型字面量(string literal)由雙引號(hào)中的字符串組成,形式如下:
1. "characters"
文本型字面量中不能包含未轉(zhuǎn)義的雙引號(hào) "颠猴、未轉(zhuǎn)義的反斜線\关划、回車符(carriage return)或換行符(line feed)。
可以在文本型字面量中使用的轉(zhuǎn)義特殊符號(hào)如下:
- 空字符(Null Character)\0
- 反斜線(Backslash)\
- 水平 Tab (Horizontal Tab)\t
- 換行符(Line Feed)\n
- 回車符(Carriage Return)\r
- 雙引號(hào)(Double Quote)"
- 單引號(hào)(Single Quote)'
字符也可以用以下方式表示:
- \x 后跟兩位十六進(jìn)制數(shù)字
- \u 后跟四位十六進(jìn)制數(shù)字
- \U 后跟八位十六進(jìn)制數(shù)字
后跟的數(shù)字表示一個(gè) Unicode 碼點(diǎn)翘瓮。
文本型字面量允許在反斜線小括號(hào) () 中插入表達(dá)式的值贮折。插入表達(dá)式(interpolated expression)不能包含未轉(zhuǎn)義的雙引號(hào)"、反斜線 \资盅、回車符或者換行符调榄。表達(dá)式值的類型必須在 String 類中有對(duì)應(yīng)的初始化方法。
例如呵扛,以下所有文本型字面量的值相同:
1. "1 2 3"
2. "1 2 \(3)"
3. "1 2 \(1 + 2)"
4. var x = 3; "1 2 \(x)"
文本型字面量的默認(rèn)類型為 String每庆。組成字符串的字符類型為 Character。更多有關(guān) String 和 Character 的信息請(qǐng)參照 字符串和字符今穿。
文本型字面量語法
string-literal → "- quoted-text -"-
quoted-text → quoted-text-item- quoted-text -opt-
quoted-text-item → escaped-character-
quoted-text-item → (- expression- )-
quoted-text-item → 除 "扣孟、\-、U+000A 或 U+000D 以外的任何 Unicode 擴(kuò)展字符集
escaped-character → \0- | \- | \t- | \n- | \r- | "- | '-
escaped-character → \x- hexadecimal-digit- hexadecimal-digit-
escaped-character → \u -hexadecimal-digit- hexadecimal-digit -hexadecimal-digit- hexadecimal-digit-
escaped-character → \U- hexadecimal-digit- hexadecimal-digit- hexadecimal-digit- hexadecimal-digit- hexadecimal-digit-hexadecimal-digit- hexadecimal-digit- hexadecimal-digit-
運(yùn)算符
Swift 標(biāo)準(zhǔn)庫定義了許多可供使用的運(yùn)算符荣赶,其中大部分在 基礎(chǔ)運(yùn)算符 和 高級(jí)運(yùn)算符 中進(jìn)行了闡述凤价。這里將描述哪些字符能用作運(yùn)算符。
運(yùn)算符由一個(gè)或多個(gè)以下字符組成: /拔创、=利诺、-、+剩燥、!慢逾、、%灭红、<侣滩、>、&变擒、|君珠、^、~娇斑、.策添。也就是說材部,標(biāo)記 =, ->、//唯竹、/乐导、*/、. 以及一元前綴運(yùn)算符 & 屬于保留字浸颓,這些標(biāo)記不能被重寫或用于自定義運(yùn)算符物臂。
運(yùn)算符兩側(cè)的空白被用來區(qū)分該運(yùn)算符是否為前綴運(yùn)算符(prefix operator)、后綴運(yùn)算符(postfix operator)或二元運(yùn)算符(binary operator)产上。規(guī)則總結(jié)如下:
- 如果運(yùn)算符兩側(cè)都有空白或兩側(cè)都無空白鹦聪,將被看作二元運(yùn)算符。例如:a+b 和 a + b 中的運(yùn)算符 + 被看作二元運(yùn)算符蒂秘。
- 如果運(yùn)算符只有左側(cè)空白泽本,將被看作前綴一元運(yùn)算符。例如 a ++b 中的 ++ 被看作前綴一元運(yùn)算符姻僧。
- 如果運(yùn)算符只有右側(cè)空白规丽,將被看作后綴一元運(yùn)算符。例如 a++ b 中的 ++ 被看作后綴一元運(yùn)算符撇贺。
- 如果運(yùn)算符左側(cè)沒有空白并緊跟 .赌莺,將被看作后綴一元運(yùn)算符。例如 a++.b 中的 ++ 被看作后綴一元運(yùn)算符(同理松嘶, a++ . b 中的 ++ 是后綴一元運(yùn)算符而 a ++ .b 中的 ++ 不是).
鑒于這些規(guī)則艘狭,運(yùn)算符前的字符 (、[ 和 { 翠订;運(yùn)算符后的字符 )巢音、] 和 } 以及字符 ,、; 和 : 都將用于空白檢測(cè)尽超。
以上規(guī)則需注意一點(diǎn)官撼,如果運(yùn)算符 ! 或 ? 左側(cè)沒有空白,則不管右側(cè)是否有空白都將被看作后綴運(yùn)算符似谁。如果將 ? 用作可選類型(optional type)修飾傲绣,左側(cè)必須無空白。如果用于條件運(yùn)算符 ? :巩踏,必須兩側(cè)都有空白秃诵。
在特定構(gòu)成中 ,以 < 或 > 開頭的運(yùn)算符會(huì)被分離成兩個(gè)或多個(gè)標(biāo)記塞琼,剩余部分以同樣的方式會(huì)被再次分離菠净。因此,在Dictionary<String, Array<Int>> 中沒有必要添加空白來消除閉合字符 > 的歧義。在這個(gè)例子中嗤练, 閉合字符 > 被看作單字符標(biāo)記,而不會(huì)被誤解為移位運(yùn)算符 >>在讶。
要學(xué)習(xí)如何自定義新的運(yùn)算符煞抬,請(qǐng)參考 自定義操作符 和 運(yùn)算符聲明。學(xué)習(xí)如何重寫現(xiàn)有運(yùn)算符构哺,請(qǐng)參考 運(yùn)算符方法革答。
運(yùn)算符語法
operator → operator-character- operator- opt-
operator-character → /- | =- | -- | +- | !- | *- | %- | <- | >- | &- | |- | ^- | ~- | .-
binary-operator → operator-
prefix-operator → operator-
postfix-operator → operator-