跳到主要内容

Swift 语法总结

词法结构​

空白字符语法

空白字符 → 空白字符项 空白字符可选

空白字符项 → 换行符

空白字符项 → 内联空间

空白字符项 → 注释

空白字符项 → 多行注释

空白字符项 → U+0000,U+0009,U+000B,U+000C 或 U+0020

换行符* → U+000A

换行符 → U+000D

换行符 → U+000D 后面是 U+000A

注释 → // 单行内容注释 换行符

注释 → /* 多行内容注释 */

注释内容 → 注释内容项 注释内容可选

注释内容项 → 除 U+000A 或 U+000D 外的任何 Unicode 标量值

多行注释内容 → 多行注释内容项 多行注释内容可选

多行注释内容项 → 多行内容

多行注释内容项 → 注释内容项

多行注释内容项 → 除 /* 或 */ 外的任何 Unicode 标量值

标识符语法

标识符 → 标识符头(Head) 标识符字符集可选

标识符 → 标识符头(Head) 标识符字符集可选

标识符 → 隐式参数名

标识符 → 属性包装器呈现值

标识符集 → 标识符 | 标识符 , 标识符集

标识符头(Head) → 大写或者小写字母 A 到 Z

标识符头(Head) → _

标识符头(Head) → U+00A8, U+00AA, U+00AD, U+00AF, U+00B2–U+00B5, or U+00B7–U+00BA

标识符头(Head) → U+00BC–U+00BE, U+00C0–U+00D6, U+00D8–U+00F6, or U+00F8–U+00FF

标识符头(Head) → U+0100–U+02FF, U+0370–U+167F, U+1681–U+180D, or U+180F–U+1DBF

标识符头(Head) → U+1E00–U+1FFF

标识符头(Head) → U+200B–U+200D, U+202A–U+202E, U+203F–U+2040, U+2054, or U+2060–U+206F

标识符头(Head) → U+2070–U+20CF, U+2100–U+218F, U+2460–U+24FF, or U+2776–U+2793

标识符头(Head) → U+2C00–U+2DFF or U+2E80–U+2FFF

标识符头(Head) → U+3004–U+3007, U+3021–U+302F, U+3031–U+303F, or U+3040–U+D7FF

标识符头(Head) → U+F900–U+FD3D, U+FD40–U+FDCF, U+FDF0–U+FE1F, or U+FE30–U+FE44

标识符头(Head) → U+FE47–U+FFFD

标识符头(Head) → U+10000–U+1FFFD, U+20000–U+2FFFD, U+30000–U+3FFFD, or U+40000–U+4FFFD

标识符头(Head) → U+50000–U+5FFFD, U+60000–U+6FFFD, U+70000–U+7FFFD, or U+80000–U+8FFFD

标识符头(Head) → U+90000–U+9FFFD, U+A0000–U+AFFFD, U+B0000–U+BFFFD, or U+C0000–U+CFFFD

标识符头(Head) → 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

标识符字符 → 标识符头(Head)

标识符字符集 → 标识符字符 标识符字符集可选

隐式参数名 → $ 十进制数字集

属性包装器呈现值 → $ 标识符字符集

字面量语法

字面量 → 数值型字面量 | 字符串字面量 | 正则表达式字面量 | 布尔字面量 | 空字面量

数值型字面量 → -可选整形字面量 | -可选浮点型字面量

布尔字面量 → true | false

空字面量 → nil

整型字面量语法

整型字面量 → 二进制字面量

整型字面量 → 八进制字面量

整型字面量 → 十进制字面量

整型字面量 → 十六进制字面量

二进制字面量 → 0b 二进制数字 二进制字面量字符集可选

二进制数字 → 数值 0 到 1

二进制字面量字符 → 二进制数字 | -

二进制字面量字符集 → 二进制字面量字符 二进制字面量字符集可选

八进制字面量 → 0o 八进制数字 八进制字符集可选

八进字数字 → 数值 0 到 7

八进制字符 → 八进制数字 | -

八进制字符集 → 八进制字符 八进制字符集可选

十进制字面量 → 十进制数字 十进制字符集可选

十进制数字 → 数值 0 到 9

十进制数字集 → 十进制数字 十进制数字集可选

十进制字面量字符 → 十进制数字 | -

十进制字面量字符集 → 十进制字面量字符 十进制字面量字符集可选

十六进制字面量 → 0x 十六进制数字 十六进制字面量字符集可选

十六进制数字 → 数值 0 到 9,a 到 f,或者 A 到 F

十六进制字符 → 十六进制数字 | -

十六进制字面量字符集 → 十六进制字符 十六进制字面量字符集可选

浮点型字面量语法

浮点数字面量 → 十进制字面量 十进制分数可选十进制指数可选

浮点数字面量 → 十六进制字面量 十六进制分数可选十六进制指数

十进制分数 → . 十进制字面量

十进制指数 → 浮点数 e 正负号可选十进制字面量

十六进制分数 → . 十六进制数

十六进制指数 → 浮点数 p 正负号可选十六进制字面量

浮点数 e → e | E

浮点数 p → p | P

正负号 → + | -

字符串型字面量语法

字符串字面量 → 静态字符串字面量 | 插值字符串字面量

字符串开分隔定界符 → 字符串扩展分隔符 "

字符串闭分隔定界符 → " 字符串扩展分隔符可选

静态字符串字面量 → 字符串开分隔定界符 引用文本可选 字符串闭分隔定界符

静态字符串字面量 → 多行字符串开分隔定界符 多行引用文本可选 多行字符串闭分隔定界符

多行字符串开分隔定界符 → 字符串扩展分隔符 """

多行字符串闭分隔定界符 → """ 字符串扩展分隔符

字符串扩展分隔符 → # 字符串扩展分隔符可选

引用文本 → 引用文本项 引用文本可选

引用文本项 → 转义字符

引用文本项 → 除了 "、**\**、U+000A、U+000D 以外的所有 Unicode 字符

多行引用文本 → 多行引用文本项 多行引用文本可选

多行引用文本项 转义字符可选

多行引用文本 → 除了 \ 以外的任何 Unicode 标量值

多行引用文本 → 转义换行

插值字符串字面量 → 字符串开分隔定界符 插值文本可选 字符串闭分隔定界符

插值字符串字面量 → 多行字符串开分隔定界符 插值文本可选 多行字符串闭分隔定界符

插值文本 → 插值文本项 插值文本可选

插值文本项 → \(表达式) | 引用文本项

多行插值文本 → 多行插值文本项 多行插值文本可选

多行插值文本项 → \( 表达式 ) | 多行引用文本项

转义序列 → \ 字符串扩展分隔符

转义字符 → 转义序列 0 | 转义序列 \ | 转义序列 t | 转义序列 n | 转义序列 r | 转义序列 " | 转义序列 '

转义字符 → 转义序列 u { unicode 标量数字 }

unicode 标量数字 → 一到八位的十六进制数字

转义换行符 → 转义序列 空白可选 换行符

正则表达式字面量语法

正则表达式字面量 → 正则表达式字面量开分隔定界符 正则表达式 正则表达式字面量闭分隔定界符

正则表达式 → 任何正则表达式

正则表达式字面量开分隔定界符 → 正则表达式扩展分隔符可选 /

正则表达式字面量闭分割定界符 → / 正则表达式扩展分隔符可选

正则表达式扩展分隔符 → # 正则表达式扩展分隔符可选

运算符语法语法

运算符 → 运算符头 运算符字符集可选

运算符 → 点运算符头 点运算符字符集可选

运算符字符 → / | = | - | + | ! | * | % | < | > | & | | | ^ | ~ | ?

运算符头 → 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

运算符字符 → 运算符头

运算符字符 → U+0300–U+036F

运算符字符 → U+1DC0–U+1DFF

运算符字符 → U+20D0–U+20FF

运算符字符 → U+FE00–U+FE0F

运算符字符 → U+FE20–U+FE2F

运算符字符 → U+E0100–U+E01EF

运算符字符集 → 运算符字符 运算符字符集可选

点运算符头 → ..

点运算符字符 → . | 运算符字符

点运算符字符集 → 点运算符字符 点运算符字符集可选

二元运算符 → 运算符

前置运算符 → 运算符

后置运算符 → 运算符

类型​

类型语法

类型 → 数组类型

类型 → 字典类型

类型 → 函数类型

类型 → 类型标识符

类型 → 元组类型

类型 → 可选类型

类型 → 隐式解析可选类型

类型 → 协议合成类型

类型 → 隐含类型

类型 → 元类型

类型 → 任意类型

类型 → 自身类型

类型 → ( type )

类型注解语法

类型注解 → : 属性(Attributes)集可选类型

类型标识语法

类型标识 → 类型名称 泛型参数从句可选| 类型名称 泛型参数从句可选. 类型标识符

类型名 → 标识符

元组类型语法

元组类型 → ( ) | ( 元组类型元素 , 元组类型元素列表 )

元组类型元素列表 → 元组类型元素 | 元组类型元素 , 元组类型元素列表

元组类型元素 → 元素名 类型注解 | 类型

元素名 → 标识符

函数类型语法

函数类型 → 类型 函数类型子句 async可选 throws可选-> 类型

函数类型 → 类型 rethrows -> 类型

函数类型子句 → ( )

函数类型子句 → ( 函数类型参数列表 *...*­可选 )

函数类型参数列表 → 函数类型参数 | 函数类型参数, 函数类型参数列表

函数类型参数 → 特性列表可选 输入输出参数可选 类型 | 参数标签 类型注解

参数标签 → 标识符

数组类型语法

数组类型 → [ 类型 ]

字典类型语法

字典类型 → [ 类型 : 类型 ]

可选类型语法

可选类型 → 类型 ?

隐式解析可选类型(Implicitly Unwrapped Optional Type)语法

隐式解析可选类型 → 类型 !

协议合成类型语法

协议合成类型 → 类型标识符 | 协议合成延续

协议持续延续 → 类型标识符 | 协议合成类型

元(Metatype)类型语法

元类型 → 类型 . Type | 类型 . Protocol

类型继承从句语法

类型继承从句 → : 类型继承集

类型继承集 → 特性可选 类型标识符 | 特性可选 类型标识符 , 类型继承集

类条件 → class

表达式​

表达式语法

表达式 → try 运算符可选 前缀表达式 二元表达式列表

表达式列表 → 表达式|表达式, 表达式列表

前缀表达式语法

前缀表达式 → 前缀操作符可选 前缀表达式

前缀表达式 → 输入输出表达式

输入输出表达式 → & 标识符

try 表达式语法

try 操作符 → try | **try ? ** | ** try ! **

await 表达式语法

await 操作符 → await

中缀表达式语法

中缀表达式 → 中缀运算符 前缀表达式

中缀表达式 → 赋值操作符 try 运算符可选 前缀表达式

中缀表达式 → 条件运算符 try 运算符可选 前缀表达式

中缀表达式 → 类型转换运算符

中缀表达式 → 中缀表达式 中缀表达式列表可选

赋值操作符语法

赋值运算符 → [=]

条件运算符

条件运算符 → [?] 表达式:

类型转换运算符语法

类型转换运算符 → [is] 类型

类型转换运算符 → [as] 类型

类型转换运算符 → [as ?] 类型

类型转换运算符 → [as !] 类型

基础表达式语法

基础表达式 → 标识符 泛型实参子句可选

基础表达式 → 字面量表达式

基础表达式 → self 表达式

基础级表达式 → 父类表达式

基础表达式 → 闭包表达式

基础表达式 → 圆括号表达式

基础表达式 → 元组表达式

基础表达式 → 隐式成员表达式

基础表达式 → 通配符表达式

基础表达式 → key-path表达式

基础表达式 → 选择器表达式

基础表达式 → key-path 字符串表达式

字面量表达式语法

字面量表达式 → 字面量

字面量表达式 → 数组字面量 | 字典字面量 | 练习场字面量

字面量表达式 → #file | #filePath | #line | #column | #function | dsohandle

数组字面量 → [ 数组字面量项列表可选 ] 数组字面量项列表 → 数组字面量项可选 | 数组字面量项,数组字面量项列表 数组字面量项 → 表达式

字典字面量 → [字典字面量项列表 ] | [ : ]

字典字面量项列表 → 字典字面量项 ,**可选 | 字典字面量项 ,字典字面量项列表

字典字面量项 → 表达式 : 表达式

palyground 字面量 → #colorLiteral ( red : 表达式 , green :表达式, blue :表达式 , alpha : 表达式 )

playground 字面量 → #fileLiteral ( resourceName : 表达式 )

playground 字面量 → **#imageLiteral ( resourceName : 表达式 )

self 表达式语法

self 表达式 → self | self 方法表达式 | self 下标表达式 | self 构造器表达式

self 方法表达式 → self . 标识符

self 下标表达式 → self [ 函数调用参数表 ]

self 构造器表达式 → self . init

父类表达式语法

父类表达式 → 父类方法表达式 | 父类下标表达式 | 父类构造器表达式

父类方法表达式 → super . 标识符

父类下标表达式 → super [函数调用参数表 ]

父类构造器表达式 → super . init

闭包表达式语法

闭包表达式 → { 闭包签名可选 语句 }

闭包签名 → 捕获列表 参数子句 async可选 throws可选 函数结果可选 in

闭包签名 → 标识符列表 函数结果可选 in

闭包参数子句 ( ) | ( 闭包参数列表 | 标识符列表 )

闭包参数列表 闭包参数 | 闭包参数, 闭包参数列表

闭包参数 闭包参数名 类型声明 可选

闭包参数 闭包参数名 类型声明 ...

闭包参数名 标识符

捕获列表 → 捕获列表 [ 捕获列表项列表 ]

捕获列表项列表 → 捕获列表项 | 捕获列表项 , 捕获列表项列表

捕获列表项 → 捕获说明符可选 表达式

捕获说明符 → weak | unowned | unowned(safe) | unowned(unsafe)

隐式成员表达式语法

隐式成员表达式 → . 标识符

圆括号表达式语法

圆括号表达式 → ( 表达式 )

元组表达式语法

元组表达式 → ( ) | (元组元素, 元组元素列表 )

元组元素列表 → 元组元素 | 元组元素 , 元组元素列表 元组元素 → 表达式 | 标识符 : 表达式

通配符表达式语法

通配符表达式 → _

key-path表达式语法

key-path 表达式 → ** 类型可选 . [多个 key-path 组件] 多个 key-path 组件 → key-path 组件 | key-path 组件 . 多个 key-path 组件 key-path 组件 → 标识符 多个 key-path 后缀可选 | 多个 key-path 后缀 多个 key-path 后缀 → key-path 后缀 多个 key-path 后缀可选 key-path-postfixes {./04_Expressions.md#key-path-postfixes}

key-path 后缀 → ? | ! | self | [ 函数调用参数表 ]

选择器表达式语法

选择器表达式 → #selector ( 表达式 )

选择器表达式 → #selector ( getter:表达式 )

选择器表达式 → #selector ( setter:表达式 )

key-path 字符串表达式语法 key-path 字符串表达式 → #keyPath ( 表达式 )

后缀表达式表达式语法

后缀表达式 → 基本表达式

后缀表达式 → 后缀表达式 后缀运算符

后缀表达式 → 函数调用表达式

后缀表达式 → 构造器表达式

后缀表达式 → 显式成员表达式

后缀表达式 → 后缀 self 表达式

后缀表达式 → 下标表达式

后缀表达式 → 强制取值表达式

后缀表达式 → 可选链表达式

函数调用表达式语法

函数调用表达式 → 后缀表达式 函数调用参数子句

函数调用表达式 → 后缀表达式 函数调用参数子句可选 尾随闭包

函数调用参数子句 → ( ) | ( 函数调用参数表 )

函数调用参数表 → 函数调用参数 | 函数调用参数 , 函数调用参数表

函数调用参数 → 表达式 | 标识符 : 表达式

函数调用参数 → 运算符 | 标识符 : 运算符

尾随闭包 → 闭包表达式 标签尾随闭包可选

标签尾随闭包集→ 标签尾随闭包 标签尾随闭包集

标签尾随闭包→ 标识符 : 闭包表达式

初始化表达式语法

构造器表达式 → 后缀表达式 . init

构造器表达式 → 后缀表达式 . init ( 参数名称 )

显式成员表达式语法

显式成员表达式 → 后缀表达式 . 十进制数字

显式成员表达式 → 后缀表达式 . 标识符 泛型实参子句可选

显式成员表达式 → 后缀表达式 . 标识符 ( 参数名称 )

显式成员表达式 → 后缀表达式 条件编译块

参数名称 → 参数名 参数名称可选

参数名 → 标识符 :

后缀 self 表达式语法

后缀 self 表达式 → 后缀表达式 . self

下标表达式语法

下标表达式 → 后缀表达式 [ 表达式列表 ]

强制取值表达式语法 强制取值表达式 → 后缀表达式 !

可选链式表达式语法 可选链表达式 → 后缀表达式 ?

语句​

语句语法

语句 → 表达式 ;可选

语句 → 声明 ;可选

语句 → 循环语句 ;可选

语句 → 分支语句 ;可选

语句 → 标签语句 ;可选

语句 → 控制转移语句 ;可选

语句 → 延迟语句 ;可选

语句 → 执行语句 ;可选

语句 → 编译控制语句

语句集 → 语句 语句集可选

循环语句语法

循环语句 → for-in 语句

循环语句 → [while 语句](./05_Statements.md#wheetatype 类型 ile-statement)

循环语句 → repeat-while 语句

For-In 循环语法

for-in 语句 → for case可选 模式 in 表达式 where 子句可选 代码块

While 循环语法

while 语句 → while 条件集 代码块

条件集 → 条件 | 条件 , 条件集

条件 → 表达式 | 可用性条件 | case 条件 | 可选绑定条件

case 条件 → case 模式 构造器

可选绑定条件 → let 模式 构造器可选 | var 模式 构造器可选

Repeat-While 语句语法

repeat-while-statement → repeat 代码块 while 表达式

分支语句语法

分支语句 → if 语句

分支语句 → guard 语句

分支语句 → switch 语句

If 语句语法

if 语句 → if 条件集 代码块 else 子句可选

else 子句 → else 代码块 | else if 语句

Guard 语句语法

guard 语句 → guard 条件集 else 代码块

Switch 语句语法

switch 语句 → switch 表达式 { switch-case集可选 }

switch-case集 → switch-case switch-case集可选

switch-case → case 标签 语句集

switch-case → default 标签 语句集

switch-case → 条件 switch-case

case 标签 → 特性可选 case case 项集 :

case 项集 → 模式 where 子句可选 | 模式 where 子句可选 , case 项集

default 标签 → 特性可选 default :

where 子句 → where where 表达式

where 表达式 → 表达式

条件 switch-case → switch if 指令子句 switch elseif 指令子句集可选 switch else 指令子句可选 endif 指令

switch if 指令子句 → if 指令 编译条件 switch-case集可选

switch elseif 指令子句集 → elseif 指令子句 switch elseif 指令子句集可选

switch elseif 指令子句 → elseif 指令 编译条件 switch-case集可选

switch else 指令子句 → else 指令 switch-case集可选

标签语句语法

标签语句 → 语句标签 循环语句

标签语句 → 语句标签 if 语句

标签语句 → 语句标签 switch 语句

标签语句 → 语句标签 do 语句

语句标签 → 标签名称 :

标签名称 → 标识符

控制转移语句语法

控制转移语句 → break 语句

控制转移语句 → continue 语句

控制转移语句 → fallthrough 语句

控制转移语句 → return 语句

控制转移语句 → throw 语句

Break 语句语法

break 语句 → break 标签名称可选

Continue 语句语法

continue 语句 → continue 标签名称可选

Fallthrough 语句语法

fallthrough 语句 → fallthrough

Return 语句语法

return 语句 → return 表达式可选

Throw 语句语法

throw 语句 → throw 表达式

Defer 语句语法

defer 语句 → defer 代码块

Do 语句语法

do 语句 → do 代码块 catch 子句集可选

catch 子句集 → catch 子句 catch 子句集可选

catch 子句 → catch catch 模式列表可选 代码块可选

catch 模式列表 → catch 模式 | catch 模式 ,catch 模式列表

catch 模式 → 模式 where 子句可选

编译控制语句

编译控制语句 → 条件编译块

编译控制语句 → 行控制语句

编译控制语句 → 诊断语句

条件编译块语法

条件编译块 → if 指令子句 elseif 指令子句集可选 else 指令子句可选 endif 指令

if 指令子句 → if 指令 编译条件 语句集可选

elseif 指令子句集 → elseif 指令子句 elseif 指令子句集可选

elseif 指令子句 → elseif 指令 编译条件 语句集可选

else 指令子句 → else 指令 语句集可选

if 指令 → #if

elseif 指令 → #elseif

else 指令 → #else

endif 指令 → #endif

编译条件 → 平台条件

编译条件 → 标识符

编译条件 → 布尔字面量

编译条件 → ( 编译条件 )

编译条件 → ! 编译条件

编译条件 → 编译条件 && 编译条件

编译条件 → 编译条件 || 编译条件

平台条件 → os ( 操作系统 )

平台条件 → arch ( 架构 )

平台条件 → swift ( >= swift 版本 ) | swift ( < swift 版本 )

平台条件 → compiler ( >= swift 版本 ) | compiler ( < swift 版本 )

平台条件 → canImport ( 模块名 )

平台条件 → targetEnvironment ( 环境 )

操作系统 → macOS | iOS | watchOS | tvOS

架构 → i386 | x86_64 | arm | arm64

swift 版本 → 十进制数字集 swift 版本后缀可选

swift 版本后缀 → . 十进制数字集 swift 版本集可选

模块名 → 标识符

环境 → 模拟器 | macCatalyst

行控制语句语法

行控制语句 → #sourceLocation ( file: 文件名 , line: 行号 )

行控制语句 → #sourceLocation ( )

行号 → 一个大于 0 的十进制数字

文件名 → 静态字符串字面量

编译期诊断语句语法

诊断语句 → #error ( 诊断信息 )

诊断语句 → #warning ( 诊断信息 )

诊断信息 → 静态字符串字面量

可用性条件语法

可用性条件 → #available ( 可用性参数集 )

可用性参数集 → 可用性参数 | 可用性参数 , 可用性参数集)

可用性参数 → 平台名 平台版本

可用性参数 → *

平台名 → iOS | iOSApplicationExtension

平台名 → macOS | macOSApplicationExtension

平台名 → watchOS

平台名 → tvOS

平台版本 → 十进制数字集

平台版本 → 十进制数字集 . 十进制数字集

平台版本 → 十进制数字集 . 十进制数字集 . 十进制数字集

声明​

声明语法

声明 → 导入声明

声明 → 常量声明

声明 → 变量声明

声明 → 类型别名声明

声明 → 函数声明

声明 → 枚举声明

声明 → 结构体声明

声明 → 类声明

声明 → actor 声明

声明 → 协议声明

声明 → 构造器声明

声明 → 析构器声明

声明 → 扩展声明

声明 → 下标声明

声明 → 运算符声明

声明 → 优先级组声明

声明集 → 声明 声明集可选

顶级声明语法

顶级声明 → 多条语句可选

代码块语法

代码块 → { 多条语句可选 }

导入声明语法

导入声明 → 特性可选 import 导入类型可选 导入路径

导入类型 → typealias | struct | class | enum | protocol | let | var | func

导入路径 → 导入路径标识符 | 导入路径标识符 . 导入路径

导入路径标识符 → 标识符 | 运算符

常数声明语法

常量声明 → 特性可选 声明修饰符集可选 let 模式构造器集

模式构造器集 → 模式构造器 | 模式构造器 , 模式构造器集

模式构造器 → 模式 构造器可选

构造器 → = 表达式

变量声明语法

变量声明 → 变量声明头 模式构造器集

变量声明 → 变量声明头 变量名 类型注解 代码块

变量声明 → 变量声明头 变量名 类型注解 getter-setter 块

变量声明 → 变量声明头 变量名 类型注解 getter-setter 关键字块

变量声明 → 变量声明头 变量名 构造器可选 willSet-didSet 代码块

变量声明 → 变量声明头 变量名 类型注解 构造器可选 willSet-didSet 代码块

变量声明头 → 特性可选 声明修饰符集可选 var

变量名称 → 标识符

getter-setter 块 → 代码块

getter-setter 块 → { getter 子句 setter 子句可选 }

getter-setter 块 → { setter 子句 getter 子句 }

getter 子句 → 特性可选 可变性修饰符可选 get 代码块

setter 子句 → 特性可选 可变性修饰符可选 set setter 名称可选 代码块

setter 名称 → ( 标识符 )

getter-setter 关键字(Keyword)块 → { getter 关键字子句 setter 关键字子句可选 }

getter-setter 关键字(Keyword)块 → { setter 关键字子句 getter 关键字子句 }

getter 关键字(Keyword)子句 → 特性可选 可变性修饰符可选 get

setter 关键字(Keyword)子句 → 特性可选 可变性修饰符可选 set

willSet-didSet 代码块 → { willSet 子句 didSet 子句可选 }

willSet-didSet 代码块 → { didSet 子句 willSet 子句可选 }

willSet 子句 → 特性可选 willSet setter 名称可选 代码块

didSet 子句 → 特性可选

didSet setter 名称可选 代码块

类型别名声明语法

类型别名声明 → 特性可选 访问级别修饰符 typealias 类型别名名称 泛型参数子句可选 类型别名赋值

类型别名名称 → 标识符

类型别名赋值 → = 类型

函数声明语法

函数声明 → 函数头 函数名 泛型参数子句可选 函数签名 泛型 where 子句可选 函数体可选

函数头 → 特性可选 声明描述符集可选 func

函数名 → 标识符 | 运算符

函数签名 → 参数子句 async可选 throws可选 函数结果可选

函数签名 → 参数子句 async可选 rethrows 函数结果可选

函数结果 → -> 特性可选 类型

函数体 → 代码块

参数子句 → ( ) | ( 参数集 )

参数集 → 参数 | 参数 , 参数集

参数 → 外部参数名可选 本地参数名 类型注解 默认参数子句可选

参数 → 外部参数名可选 本地参数名 类型注解

参数 → 外部参数名可选 本地参数名 类型注解 ...

外部参数名 → 标识符

本地参数名 → 标识符

默认参数子句 → = 表达式

枚举声明语法

枚举声明 → 特性可选 访问级别修饰符可选 联合式枚举

枚举声明 → 特性可选 访问级别修饰符可选 原始值式枚举

联合式枚举 → indirect可选 enum 枚举名 泛型参数子句可选 类型继承子句可选 泛型 where 子句可选 { 联合式枚举成员可选 }

联合式枚举成员集 → 联合式枚举成员 联合样式枚举成员集可选

联合样式枚举成员 → 声明 | 联合式枚举 case 子句 | 编译控制语句

联合式枚举 case 子句 → 特性可选 indirect可选 case 联合式枚举 case 集

联合式枚举 case 集 → 联合式枚举 case | 联合式枚举 case , 联合式枚举 case 集

联合式枚举 case → 枚举的 case 名 元组类型可选

枚举名 → 标识符

枚举的 case 名 → 标识符

原始值式枚举 → enum 枚举名 泛型参数子句可选 类型继承子句 泛型 where 子句可选 { 原始值式枚举成员集 }

原始值式枚举成员集 → 原始值式枚举成员 原始值式枚举成员集可选

原始值式枚举成员 → 声明 | 原始值式枚举 case 子句 | 编译控制语句

原始值式枚举 case 子句 → 特性可选 case 原始值式枚举 case 集

原始值式枚举 case 集 → 原始值式枚举 case | 原始值式枚举 case , 原始值式枚举 case 集

原始值式枚举 case → 枚举的 case 名 原始值赋值可选

原始值赋值 → = 原始值字面量

原始值字面量(raw-value-literal) → 数值字面量 | 静态字符串字面量 | 布尔字面量

结构体声明语法

结构体声明 → 特性可选 访问级别修饰符可选 struct 结构体名称 泛型参数子句可选 类型继承子句可选 泛型 where 子句可选 结构体主体

结构体名称 → 标识符

结构体主体 → { 结构体成员集可选 }

结构体成员集 → 结构体成员 结构体成员集可选

结构体成员 → 声明集 | 编译控制语句

类声明语法

类声明 → 特性可选 访问级别修饰符可选 final可选 class 类名 泛型参数子句可选 类型继承子句 泛型 where 子句可选 类主体

类声明 → 特性可选 final 访问级别修饰符可选 class 类名 泛型参数子句可选 类型继承子句 泛型 where 子句可选 类主体

类名 → 标识符

类主体 → { 类成员集可选 }

类成员集 → 类成员 类成员集可选

类成员 → 声明集 | 编译控制语句

协议声明语法

协议声明 → 特性可选 访问级别修饰符可选 protocol 协议名 类型继承子句可选 泛型 where 子句可选 协议主体

协议名 → 标识符

协议主体 → { 协议成员集可选 }

协议成员集 → 协议成员 协议成员集可选

协议成员 → 协议成员声明 | 编译控制语句

协议成员声明 → 协议属性声明

协议成员声明 → 协议方法声明

协议成员声明 → 协议构造器声明

协议成员声明 → 协议下标声明

协议成员声明 → 协议关联类型声明

协议成员声明 → 类型别名声明

协议属性声明语法

协议属性声明 → 变量声明头 变量名 类型注解 getter-setter 关键字块

协议方法声明语法

协议方法声明 → 函数头 函数名 泛型参数子句可选 函数签名 泛型 where 子句可选

协议构造器声明语法

协议构造器声明 → 构造器头 泛型参数子句可选 参数子句 throws可选 泛型 where 子句可选

协议构造器声明 → 构造器头 泛型参数子句可选 参数子句 rethrows 泛型 where 子句可选

协议下标声明语法

协议下标声明 → 下标头 下标结果 泛型 where 子句可选 getter-setter 关键字块

协议关联类型声明语法

协议关联类型声明 → 特性可选 访问级别修饰符可选 associatedtype 类型别名 类型继承子句可选 类型别名赋值可选 泛型 where 子句可选

构造器声明语法

构造器声明 → 构造器头 泛型参数子句可选 参数子句 throws可选 泛型 where 子句可选 构造器主体

构造器声明 → 构造器头 泛型参数子句可选 参数子句 rethrows 泛型 where 子句可选 构造器主体

构造器头(Head) → 特性可选 声明修饰符集可选 init

构造器头(Head) → 特性可选 声明修饰符集可选 init ?

构造器头(Head) → 特性可选 声明修饰符集可选 init !

构造器主体 → 代码块

析构器声明语法

析构器声明 → 特性可选 deinit 代码块

扩展声明语法

扩展声明 → 特性可选 访问级别修饰符可选 extension 类型标识 类型继承子句可选 泛型 where 子句可选 扩展主体

扩展主体 → { 扩展成员集可选 }

扩展成员集 → 扩展成员 扩展成员集可选

扩展成员 → 声明集 | 编译控制语句

下标声明语法

下标声明 → 下标头 下标结果 泛型 where 子句可选 代码块

下标声明 → 下标头 下标结果 泛型 where 子句可选 getter-setter 块

下标声明 → 下标头 下标结果 泛型 where 子句可选 getter-setter 关键字块

下标头(Head) → 特性可选 声明修饰符集可选 subscript 泛型参数子句可选 参数子句

下标结果(Result) → -> 特性可选 类型

运算符声明语法

运算符声明 → 前置运算符声明 | 后置运算符声明 | 中置运算符声明

前置运算符声明 → prefix operator 运算符

后置运算符声明 → postfix operator 运算符

中置运算符声明 → infix operator 运算符 中置运算符特性可选

中置运算符特性 → 优先级组名

优先级组声明语法

优先级组声明 → precedencegroup 优先级组名 { 优先级组特性可选 }

优先级组特性 → 优先级组属性 优先级组特性可选

优先级组属性 → 优先级组关系

优先级组属性 → 优先级组赋值

优先级组属性 → 优先级组结合

优先级组关系 → higherThan : 优先级组名集

优先级组关系 → lowerThan : 优先级组名集

优先级组赋值 → assignment : 布尔字面量

优先级组结合 → associativity : left

优先级组结合 → associativity : right

优先级组结合 → associativity : none

优先级组名集 → 优先级组名 | 优先级组名 , 优先级组名集

优先级组名 → 标识符

声明修饰符语法

声明修饰符 → class | convenience | dynamic | final | infix | lazy | optional | override | postfix | prefix | required | static | unowned | unowned(safe) | unowned(unsafe) | weak

声明修饰符 → 访问级别修饰符

声明修饰符 → 可变性修饰符

声明修饰符 → actor 隔离修饰符

声明修饰符集 → 声明修饰符 声明修饰符集可选

访问级别修饰符 → private | private(set)

访问级别修饰符 → fileprivate | fileprivate(set)

访问级别修饰符 → internal | internal(set)

访问级别修饰符 → public | public(set)

访问级别修饰符 → open | open(set)

可变性修饰符 → mutating | nonmutating

actor 隔离修饰符 → nonisolated

属性​

属性语法

属性 → @ 属性名 属性参数子句可选

属性名 → 标识符

属性参数子句 → { 平衡令牌集可选 }

属性(Attributes)集 → 属性 特性可选

平衡令牌集 → 平衡令牌 平衡令牌集可选

平衡令牌 → ( 平衡令牌集可选 )

平衡令牌 → [ 平衡令牌集可选 ]

平衡令牌 → { 平衡令牌集可选 }

平衡令牌 → 任意标识符、关键字、字面量或运算符

平衡令牌 → 除 ( 、)、[、]、{、} 外的任意标点符号

模式​

模式语法

模式 → 通配符模式 类型注解可选

模式 → 标识符模式 [类型注解](./03_Types.md#type-annotati Value Bindingon )可选

模式 → 值绑定模式

模式 → 元组模式 类型注解可选

模式 → 枚举 case 模式

模式 → 可选模式

模式 → 类型转换模式

模式 → 表达式模式

通配符模式语法

通配符模式 → _

标识符模式语法

标识符模式 → 标识符

值绑定模式语法

值绑定模式 → var 模式 | let 模式

元组模式语法

元组模式 → ( 元组模式元素集可选 )

元组模式元素集 → 元组模式元素 | 元组模式元素 , 元组模式元素集

元组模式元素 → 模式 | 标识符 : 模式

枚举 case 模式语法

enum-case-pattern → 类型标识可选 . 枚举 case 名 元组模式可选

可选模式语法

可选模式 → 标识符模式 ?

类型转换模式语法

类型转换模式 → is 模式 | as 模式

is 模式 → is 类型

as 模式 → 模式 as 类型

表达式模式语法

表达式模式 → 表达式

泛型参数​

泛型形参子句语法

泛型参数子句 → < 泛型参数集 >

泛型参数集 → 泛型参数 | 泛形参数 , 泛型参数集

泛形参数 → 类型名称

泛形参数 → 类型名称 : 类型标识

泛形参数 → 类型名称 : 协议合成类型

泛型 where 子句 → where 约束集

约束集 → 约束 | 约束 , 约束集

约束 → 一致性约束 | 同类型约束

一致性约束 → 类型标识 : 类型标识

一致性约束 → 类型标识 : 协议合成类型

同类型约束 → 类型标识 == 类型

泛型实参子句语法

泛型实参子句 → < 泛型实参集 >

泛型实参集 → 泛型实参 | 泛形实参 , 泛型实参集

泛形实参 → 类型