词汇结构
空格语法
空格 → 空格项空格 ?
空格项 → 换行符
空白项 → 行内空间
空白项 → 注释
空格项 → 多行注释
空白项 → U+0000、U+000B 或 U+000C
换行符 → U+000A
换行符 → U+000D
换行符 → U+000D 后跟 U+000A
内联空间 → 内联空间内联空间 ?
行内空间 → U+0009 或 U+0020
评论 → // 评论文本换行
多行注释 → /* 多行注释文本 */
评论文本 → 评论文本项评论文本 ?
注释文本项 → 除 U+000A 或 U+000D 之外的任何 Unicode 标量值
多行注释文本 → 多行注释文本项多行注释文本 ?
多行注释文本项 → 多行注释
多行注释文本项 → 注释文本项
多行注释文本项 → 除 /* 或 */ 之外的任何 Unicode 标量值
标识符语法
标识符 → 标识符头标识符字符 ?
标识符 → ` 标识符头标识符字符 ? `
标识符 → 隐式参数名称
标识符 → 属性包装器投影
标识符列表 → 标识符 | 标识符 , 标识符列表
标识符头 → 大写或小写字母 A 到 Z
标识符头 → _
标识符头 → U+00A8、U+00AA、U+00AD、U+00AF、U+00B2–U+00B5 或 U+00B7–U+00BA
标识符头 → U+00BC–U+00BE、U+00C0–U+00D6、U+00D8–U+00F6 或 U+00F8–U+00FF
标识符头 → U+0100–U+02FF、U+0370–U+167F、U+1681–U+180D 或 U+180F–U+1DBF
标识符头 → U+1E00–U+1FFF
标识符头 → U+200B–U+200D、U+202A–U+202E、U+203F–U+2040、U+2054 或 U+2060–U+206F
标识符头 → U+2070–U+20CF、U+2100–U+218F、U+2460–U+24FF 或 U+2776–U+2793
标识符头 → U+2C00–U+2DFF 或 U+2E80–U+2FFF
标识符头 → U+3004–U+3007、U+3021–U+302F、U+3031–U+303F 或 U+3040–U+D7FF
标识符头 → U+F900–U+FD3D、U+FD40–U+FDCF、U+FDF0–U+FE1F 或 U+FE30–U+FE44
标识符头 → U+FE47–U+FFFD
标识符头 → U+10000–U+1FFFD、U+20000–U+2FFFD、U+30000–U+3FFFD 或 U+40000–U+4FFFD
标识符头 → U+50000–U+5FFFD、U+60000–U+6FFFD、U+70000–U+7FFFD 或 U+80000–U+8FFFD
标识符头 → U+90000–U+9FFFD、U+A0000–U+AFFFD、U+B0000–U+BFFFD 或 U+C0000–U+CFFFD
标识符头 → U+D0000–U+DFFFD 或 U+E0000–U+EFFFD
标识符字符 →数字 0 到 9
标识符字符 → U+0300–U+036F、U+1DC0–U+1DFF、U+20D0–U+20FF 或 U+FE20–U+FE2F
标识符字符 → 标识符头
标识符字符 → 标识符字符标识符字符 ?
隐式参数名称 → $ 十进制数字
属性包装器投影 → $ 标识符字符
文字语法
文字 → 数字文字 | 字符串文字 | 正则表达式文字 | 布尔文字 | 零文字
数字文字 → - ? 整数文字 | - ? 浮点文字
布尔值文字 → 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-scalar-digits → 一至八个十六进制数字
转义换行符 → 转义序列行内空格 ? 换行符
正则表达式文字的语法
正则表达式文字 → 正则表达式文字开始分隔符正则表达式正则表达式文字结束分隔符
正则表达式 → 任意正则表达式
正则表达式文字开始分隔符 → 扩展正则表达式文字分隔符 ? /
正则表达式文字结束分隔符 → / 扩展正则表达式文字分隔符 ?
扩展正则表达式文字分隔符 → # 扩展正则表达式文字分隔符 ?
运算符语法
运算符 → 运算符头运算符字符 ?
运算符 → 点运算符头点运算符字符
操作符头 → / | = | - | + | ! | * | % | aslt | asgt | as | | | ^ | ~ | ?
操作符头 → U+00A1–U+00A7
操作符头 → U+00A9 或 U+00AB
操作符头 → U+00AC 或 U+00AE
操作符头 → U+00B0–U+00B1
操作符头 → U+00B6、U+00BB、U+00BF、U+00D7 或 U+00F7
操作符头 → U+2016–U+2017
操作符头 → 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+3020
操作符头 → 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
操作符字符 → 操作符字符操作符字符 ?
点运算符头 → .
点运算符字符 → . | 运算符字符
点运算符字符 → 点运算符字符点运算符字符 ?
中缀运算符 → 运算符
前缀运算符 → 运算符
后缀运算符 → 运算符
类型
类型语法
类型 → 函数类型
类型 → 数组类型
类型 → 字典类型
类型 → 类型标识符
类型 → 元组类型
类型 → 可选类型
类型 → 隐式展开可选类型
类型 → 协议组合类型
类型 → 不透明类型
类型 → 元类型类型
类型 → 任意类型
类型 → 自身类型
类型 → ( 类型 )
类型注释的语法
类型注解 → : 属性 ? inout ? 类型
类型标识符的语法
类型标识符 → 类型名称泛型参数子句 ? | 类型名称泛型参数子句 ? . 类型标识符
类型名称 → 标识符
元组类型的语法
元组类型 → ( ) | ( 元组类型元素 , 元组类型元素列表 )
元组类型元素列表 → 元组类型元素 | 元组类型元素 , 元组类型元素列表
元组类型元素 → 元素名称类型注解 | 类型
元素名称 → 标识符
函数类型语法
函数类型 → 属性 ? 函数类型参数子句 async ? throws 子句 ? -asgt 类型
函数类型参数子句 → ( )
函数类型参数子句 → ( 函数类型参数列表 ... ? )
函数类型参数列表 → 函数类型参数 | 函数类型参数 , 函数类型参数列表
函数类型参数 → 属性 ? inout ? 类型 | 参数标签类型注解
参数标签 → 标识符
throws 子句 → throws | throws ( type )
数组类型的语法
数组类型 → [ 类型 ]
字典类型的语法
字典类型 → [ 类型 : 类型 ]
可选类型的语法
可选类型 → 类型 ?
隐式解包可选类型的语法
隐式展开可选类型 → 类型 !
协议组合类型的语法
协议组合类型 → 类型标识符 as 协议组合延续
协议组合延续 → 类型标识符 | 协议组合类型
不透明类型的语法
不透明类型 → some 类型
盒装协议类型的语法
盒装协议类型 → any 类型
元类型语法
元类型类型 → 类型 . Type | 类型 . Protocol
Any 类型的语法
任意类型 → Any
Self 类型的语法
自我类型 → Self
类型继承子句的语法
类型继承子句 → : 类型继承列表
类型继承列表 → 属性 ? 类型标识符 | 属性 ? 类型标识符 , 极速继承列表
表达式
表达式语法
表达式 → try 运算符 ? await 运算符 ? 前缀表达式中缀表达式 ?
前缀表达式语法
前缀表达式 → 前缀运算符 ? 后缀表达式
前缀表达式 → in-out 表达式
输入输出表达式的语法
输入输出表达式 → as 主表达式
try 表达式的语法
try 运算符 → try | try ? | try !
await 表达式的语法
await 操作符 → await
中缀表达式语法
中缀表达式 → 中缀运算符前缀表达式
中缀表达式 → 赋值运算符 try 运算符 ? await 运算符 ? 前缀表达式
中缀表达式 → 条件运算符 try 运算符 ? await 运算符 ? 前缀表达式
中缀表达式 → 类型转换运算符
中缀表达式 → 中缀表达式中缀表达式 ?
赋值运算符的语法
赋值运算符 → =
条件运算符语法
条件运算符 → ? 表达式 :
类型转换运算符的语法
类型转换运算符 → is 类型
类型转换运算符 → as 极速
类型转换运算符 → as ? type
类型\转换运算符 → as ! type
基本表达式的语法
主表达式 → 标识符泛型参数子句 ?
主表达式 → 文字表达式
主要表达 → 自我表达
主表达式 → 超类表达式
主表达式 → 条件表达式
初级表达式 → 闭包表达式
主表达式 → 括号表达式
主表达式 → 元组表达式
主表达式 → 隐式成员表达式
主表达式 → 通配符表达式
主表达式 → 宏扩展表达式
主表达式 → 键路径表达式
主表达式 → 选择器表达式
主表达式 → 键路径字符串表达式
文字表达式的语法
文字表达式 → 文字
文字表达式 → 数组文字 | 字典文字 | 游乐场文字
数组文字 → [ 数组文字项 ? ]
数组文字项 → 数组文字项 , ? | 数组文字项 , 数组文字项
数组字面量项 → 表达式
字典文字 → [ 字典文字项 ] | [ : ]
字典文字项 → 字典文字项 , ? | 字典文字项 , 字典文字项
字典字面项 → 表达式 : 表达式
playground-literal → #color Literal ( red : 表达式 , green : 表达式 , blue : 表达式 , alpha : 表达式 )
playground-literal → #file Literal ( resource Name : 表达式 )
playground-literal → #image Literal ( resource Name : 表达式 )
自我表达的语法
自我表达 → self | 自我方法表达 | 自我下标表达 | 自我初始化表达式
自我方法表达式 → self . 标识符
自身下标表达式 → self [ 函数调用参数列表 ]
自初始化 init . self
超类表达式的语法
超类表达式 → 超类方法表达式 | 超类下标表达式 | 超类初始化表达式
超类方法表达式 → super . 标识符
超类下标表达式 → super [ 函数调用参数列表 ]
超 . 初始化表达式 init super
条件表达式的语法
条件表达式 → if 表达式 | switch 表达式
if 表达式 → if 条件列表 { 语句 } if 表达式尾
if 表达式尾部 → else if 表达式
if极速尾部 → else { 语句 }
switch 表达式 → switch 表达式 { switch 表达式情况 }
switch 表达式案例 → switch 表达式案例 switch 表达式案例 ?
switch 表达式 case → case 标签语句
switch 表达式 case → 默认标签语句
闭包表达式的语法
闭包表达式 → { 属性 ? 闭包签名 ? 语句 ? }
闭包签名 → 捕获列表 ? 闭包参数子句 async ? 抛出子句 ? 函数结果 ? in
闭包签名 → 捕获 in
闭包参数子句 → ( ) | ( 闭包参数列表 ) | 标识符列表
闭包参数列表 → 闭包参数 | 闭包参数 , 闭包参数列表
闭包参数 → 闭包参数名称类型注解 ?
闭包参数 → 闭包参数名称 类型注解 ...
闭包参数名称 → 标识符
捕获列表 → [ 捕获列表项 ]
捕获列表项 → 捕获列表项 | 捕获列表项 , 捕获列表项
捕获列表项 → 捕获说明符 ? 标识符
捕获列表项 → 捕获说明符 ? 标识符 = 表达式
捕获列表项 → 捕获说明符 ? 自我表达
捕获说明符 → weak | unowned | unowned(safe) | unowned(unsafe)
隐式成员表达式的语法
隐式成员表达式 → . 标识符
隐式成员表达式 → . 标识符 . 后缀表达式
括号表达式的语法
括号表达式 → ( 表达式 )
元组表达式的语法
元组表达式 → ( ) | ( 元组元素 , 元组元素列表 )
元组元素列表 → 元组元素 | 元组元素 , 元组元素列表
元组元素 → 表达式 | 标识符 : 表达式
```
### 通配符表达式的语法
```
通配符表达式 → _
```
### 宏扩展表达式的语法
宏扩展表达式 → # 标识符泛型参数子句 ? 函数调用参数子句 ? 尾随闭包 ?
### 键路径表达式的语法
键路径表达式 → \ 类型 ? . 键路径组件
关键路径组件 → 关键路径组件 | 关键路径组件 . 关键路径组件
键路径组件 → 标识符键路径后缀 ? | 键路径后缀
键路径后缀 → 键路径后缀键路径后缀 ?
键路径后缀 → ? | ! | self | [ 函数调用参数列表 ]
### 选择器表达式的语法
选择器表达式 → #selector ( 表达式 )
选择器表达式 → #selector ( getter: 表达式 )
选择器表达式 → #selector ( setter: 表达式 )
### 键路径字符串表达式的语法
键路径字符串表达式 → #key Path ( 表达式 )
## 后缀表达式语法
后缀表达式 → 主表达式
后缀表达式 → 后缀表达式后缀运算符
后缀表达式 → 函数调用表达式
后缀表达式 → 初始化表达式
后缀表达式 → 显式成员表达式
后缀表达式 → 后缀自我表达
后缀表达式 → 下标表达式
后缀表达式 → 强制值表达式
后缀表达式 → 可选链接表达式
### 函数调用表达式的语法
函数调用表达式 → 后缀表达式函数调用参数子句
函数调用表达式 → 后缀表达式函数调用参数子句 ? 尾随闭包
函数调用参数子句 → ( ) | ( 函数调用参数列表 )
函数调用参数列表 → 函数调用参数 | 函数调用参数 , 函数调用参数列表
函数调用参数 → 表达式 | 标识符 : 表达式
函数调用参数 → 运算符 | 标识符 : 运算符
尾随闭包 → 闭包表达式标记尾随闭包 ?
带标签的尾随闭包 → 带标签的尾随闭包带标签的尾随闭包 ?
带标签的尾随闭包 → 标识符 : 闭包表达式
### 初始化表达式的语法
init 表达式 → 后缀表达式 .
初始化表达式 → 后缀表达式 . ( 参数 init )
### 显式成员表达式的语法
显式成员表达式 → 后缀表达式 . 十进制数字
显式成员表达式 → 后缀表达式 . 标识符泛型参数子句 ?
显式成员表达式 → 后缀表达式 . 标识符 ( 参数名称 )
显式成员表达式 → 后缀表达式条件编译块
参数名称 → 参数名称参数名称 ?
参数名称 → 标识符 :
### 后缀自我表达语法
后缀自我表达 → self 表达式 .
### 下标表达式的语法
下标表达式 → 后缀表达式 [ 函数调用参数列表 ]
### 强制值表达式的语法
强制值表达式 → 后缀表达式 !
### 可选链表达式的语法
可选链式表达式 → 后缀表达式 ?
# 声明
## 语句语法
语句 → 表达式 ; ?
语句 → 声明 ; ?
语句 → 循环语句 ; ?
语句 → 分支语句 ; ?
语句 → 标记语句 ; ?
语句 → 控制转移语句 ; ?
语句 → 延迟语句 ; ?
语句 → do 语句 ; ?
语句 → 编译器控制语句
语句 → 语句语句 ?
## 循环语句的语法
循环语句 → for-in 语句
循环语句 → while 语句
循环语句 → repeat-while 语句
### for-in 语句的语法
for-in 语句 → for case ? pattern in 表达式 where 子句 ? 代码块
### while 语句的语法
while 语句 → while 条件列表代码块
条件列表 → 条件 | 条件 , 条件列表
条件 → 表达式 | 可用性条件 | 案例条件 | 可选约束条件
案例条件 → case 模式初始化程序
可选绑定条件 → let 模式初始化器 ? | var 模式初始化器 ?
### repeat-while 语句的语法
repeat-while 语句 → repeat 代码块 while 表达式
## 分支语句的语法
分支语句 → if 语句
分支语句 → 保护语句
分支语句 → switch 语句
### if 语句的语法
if 极速 → if 条件列表代码块 else 子句 ?
else 子句 → else 代码块 | else if 语句
### 保护语句的语法
保护语句 → guard 条件列表 else 代码块
### switch 语句的语法
switch 语句 → switch 表达式 { switch-cases ? }
开关盒 → 开关盒开关盒 ?
switch-case → case-label 语句
switch-case → default-label 语句
switch-case → 条件 switch-case
案例标签 → 属性 ? case 案例项目列表 :
案例项目列表 → 模式 where 子句 ? | 模式 where 子句 ? , 案例项目列表
默认标签 → 属性 ? 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-cases ?
switch-else 指令子句 → else 指令 switch-cases ?
## 标记语句的语法
标记语句 → 语句标签循环语句
标记语句 → 语句标签 if 语句
标签语句 → 语句标签 switch 语句
标记语句 → 语句标签 do 语句
语句标签 → 标签名称 :
标签名称 → 标识符
## 控制转移语句的语法
控制转移语句 → break 语句
控制转移语句 → continue 语句
控制转移语句 → fallthrough 语句
控制转移语句 → 返回语句
控制转移语句 → throw 语句
### break 语句的语法
中断语句 → break 标签名称 ?
### continue 语句的语法
continue 语句 → continue 标签名称 ?
### fallthrough 语句的语法
fallthrough 语句 → fallthrough
### 返回语句的语法
返回语句 → return 表达式 ?
### throw 语句的语法
throw 语句 → throw 表达式
### defer 语句的语法
延迟语句 → defer 代码块
### do 语句的语法
do 语句 → do throws 子句 ? 代码块 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
编译条件 → 平台条件
编译条件 → 标识符
编译条件 → 布尔字面量
编译条件 → ( 编译条件 )
编译条件 → ! 编译条件
编译条件 → 编译条件 asas 编译条件
编译条件 → 编译条件 || 编译条件
平台条件 → os ( 操作系统 )
平台条件 → arch ( 架构 )
平台条件 → swift ( asgt= swift 版本 ) | swift ( aslt swift 版本 )
平台条件 → compiler ( asgt= swift-version ) | compiler ( aslt swift-version )
平台条件 → can Import ( 导入路径 )
平台条件 → target Environment ( environment )
操作系统 → mac OS | i OS | watch OS | tv OS | vision OS | Linux | Windows
架构 → i386 | x86 _64 | arm | arm64
swift 版本 → 十进制数字 swift 版本延续 ?
swift-版本延续 → . 十进制数字 swift-版本延续 ?
环境 → simulator | mac Catalyst
```
### 行控制语句的语法
行控制语句 → #source Location ( file: 文件路径 , line: 行号 )
行控制语句 → #source Location ( )
行号 → 大于零的十进制整数
文件路径 → 静态字符串文字
### 可用性条件的语法
可用性条件 → #available ( 可用性参数 )
可用性条件 → #unavailable极速 ( 可用性参数 )
可用性参数 → 可用性参数 | 可用性参数 , 可用性参数
可用性参数 → 平台名称平台版本
可用性参数 → *
平台名称 → i OS | i OSApplication Extension
平台名称 → mac OS | mac OSApplication Extension
平台名称 → mac Catalyst | macCatalystApplicationExtension
平台名称 → watch OS | watch OSApplication Extension
平台名称 → tv OS | tv OSApplication Extension
平台名称 → vision OS | vision OSApplication Extension
平台版本 → 十进制数字
平台版本 → 十进制数字 . 十进制数字
平台版本 → 十进制数字 . 十进制数字 . 十进制数字
# 声明
## 声明语法
声明 → 导入声明
声明 → 常量声明
声明 → 变量声明
声明 → 类型别名声明
声明 → 函数声明
声明 → 枚举声明
声明 → 结构体声明
声明 → 类声明
声明 → 参与者声明
声明 → 协议声明
声明 → 初始化器声明
声明 → 析构函数声明
声明 → 扩展声明
声明 → 下标声明
声明 → 运算符声明
声明 → 优先组声明
## 顶级声明的语法
顶级声明 → 语句 ?
## 代码块语法
代码块 → { 语句 ? }
## 导入声明的语法
导入声明 → 属性 ? 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 关键字块 → { getter 关键字子句 setter 关键字子句 ? }
getter-setter 关键字块 → { setter 关键字子句 getter 关键字子句 }
getter 关键字子句 → 属性 ? 突变修饰符 ? get
setter 关键字子句 → 属性 ? 变异修饰符 ? set
willSet-didSet 块 → { willSet 子句 didSet 子句 ? }
willSet-didSet 块 → { didSet 子句 willSet 子句 ? }
willSet 子句 → 属性 ? will Set setter 名称 ? 代码块
didSet 子句 → 属性 ? did Set setter 名称 ? 代码块
## 类型别名声明的语法
类型别名声明 → 属性 ? 访问级别修饰符 ? typealias 别名 类型别名名称泛型参数子句 ? 类型别名赋值
类型别名 → 标识符
类型别名赋值 → = 类型
## 函数声明的语法
函数声明 → 函数头函数名泛型参数子句 ? 函数签名泛型 where 子句 ? 函数体 ?
函数头 → 属性 ? 声明修饰符 ? func
函数名称 → 标识符 | 运算符
函数签名 → 参数子句 async ? throws 子句 ? 函数结果 ?
函数签名 → 参数子句 async ? rethrows 函数结果 ?
函数结果 → -asgt 属性 ? 类型
函数体 → 代码块
参数子句 → ( ) | ( 参数列表 )
参数列表 → 参数 | 参数 , 参数列表
参数 → 外部参数名称 ? 本地参数名称参数类型注释默认参数子句 ?
参数 → 外部参数名称 ? 本地参数名称参数类型注解
参数 → 外部参数名称 ? 本地参数名称参数类型注释 ...
外部参数名称 → 标识符
本地参数名称 → 标识符
参数类型注解 → : 属性 ? 参数修饰符 ? 类型
参数修饰符 → inout | borrowing | consuming 默认参数子句 → = 表达式
## 枚举声明语法
枚举声明 → 属性 ? 访问级别修饰符 ? 联合样式枚举
枚举声明 → 属性 ? 访问级别修饰符 ? 原始值样式枚举
联合样式枚举 → indirect ? enum 名称泛型参数子句 ? 类型继承子句 ? 泛型 where 子句 ? { 联合样式枚举成员 ? }
联合样式枚举成员 → 联合样式枚举成员联合样式枚举成员 ?
联合样式枚举成员 → 声明 | 联合样式枚举 case 子句 | 编译器控制语句
联合样式枚举案例子句 → 属性 ? indirect ? case 联合样式枚举案例列表
联合样式枚举案例列表 → 联合样式枚举案例 | 联合样式枚举案例 , 联合样式枚举案例列表
联合样式枚举大小写 → 枚举大小写名称元组类型 ?
枚举名称 → 标识符
枚举案例名称 → 标识符
原始值样式枚举 → enum 名称泛型参数子句 ? 类型继承子句泛型 where 子句 ? { 原始值样式枚举成员 }
原始值样式枚举成员 → 原始值样式枚举成员原始值样式枚举成员 ?
原始值样式枚举成员 → 声明 | 原始值样式枚举 case 子句 | 编译器控制语句
原始值样式枚举案例子句 → 属性 ? case 原始值样式枚举案例列表
原始值样式枚举案例列表 → 原始值样式枚举案例 | 原始值样式枚举案例 , 原始值样式枚举案例列表
原始值样式枚举案例 → 枚举案例名称原始值赋值 ?
原始值赋值 → = 原始值字面量
原始值文字 → 数字文字 | 静态字符串文字 | 布尔文字
## 结构声明语法
结构声明 → 属性 ? 访问级别修饰符 ? 结构体 struct 体名称泛型参数子句 ? 类型继承子句 ? 泛型 where 子句 ? 结构体主体
结构体名称 → 标识符
结构体 → { 结构成员 ? }
结构成员 → 结构成员结构成员 ?
结构成员 → 声明 | 编译器控制语句
## 类声明的语法
类声明 → 属性 ? 访问级别修饰符 ? final ? class 类名泛型参数子句 ? 类型继承子句 ? 泛型 where 子句 ? 类体
类声明 → 属性 ? final 访问级别修饰符 ? class 类名泛型参数子句 ? 类型继承子句 ? 泛型 where 子句 ? 类体
类名 → 标识符
类主体 → { 类成员 ? }
类成员 → 类成员类成员 ?
类成员 → 声明 | 编译器控制语句
## 参与者声明的语法
参与者声明 → 属性 ? 访问级别修饰符 ? actor 参与者名称泛型参数子句 ? 类型继承子句 ? 泛型 where 子句 ? 参与者主体
演员姓名 → 标识符
演员主体 → { 演员成员 ? }
演员成员 → 演员成员演员成员 ?
参与者成员 → 声明 | 编译器控制语句
## 协议声明的语法
协议声明 → 属性 ? 访问级别修饰符 ? protocol 协议名称类型继承子句 ? 泛型 where 子句 ? 协议主体
协议名称 → 标识符
协议主体 → { 协议成员 ? }
协议成员 → 协议成员协议成员 ?
协议成员 → 协议成员声明 | 编译器控制语句
协议成员声明 → 协议属性声明
协议成员声明 → 协议方法声明
协议成员声明 → 协议初始化器声明
协议成员声明 → 协议下标声明
协议成员声明 → 协议关联类型声明
协议成员声明 → 类型别名声明
### 协议属性声明的语法
协议属性声明 → 变量声明头变量名类型注解 getter-setter 关键字块
### 协议方法声明的语法
协议方法声明 → 极速头函数名泛型参数子句 ? 函数签名泛型 where 子句 ?
### 协议初始化器声明的语法
协议初始化声明 → 初始化头泛型参数子句 ? 参数子句 throws 子句 ? 泛型 where 子句 ?
协议初始化声明 → 初始化头泛型参数子句 ? 参数子句 rethrows 泛型 where 子句 ?
### 协议下标声明的语法
协议下标声明 → 下标头下标结果泛型 where 子句 ? getter-setter 关键字块
### 协议关联类型声明的语法
协议关联类型声明 → 属性 ? 访问级别修饰符 ? associatedtype 类型类型别名名称类型继承子句 ? 类型别名赋值 ? 泛型 where 子句 ?
## 初始化器声明的语法
初始化器声明 → 初始化器头泛型参数子句 ? 参数子句 async