)
读懂《Swift 编程语言》语言参考语法标注约定与阅读指南中文版【免费下载链接】the-swift-programming-language-in-chinese中文版 Apple 官方《Swift 编程语言》项目地址: https://gitcode.com/gh_mirrors/th/the-swift-programming-language-in-chinese本文是中文版 Apple 官方《Swift 编程语言》The-Swift-Programming-Language.md语言参考部分的导读。围绕 关于语言参考 这一章系统讲解 Swift 语法描述所使用的全部标注约定箭头生成规则、斜体语法类别、加粗等宽字面量、竖线备选项、可选后缀问号等并结合 词法结构、语句、声明、类型、表达式、泛型形参和实参、特性 等章节中的真实语法规则进行印证。读完本文你将能独立读懂语言参考中任何一条语法生成规则并将其还原为可编译的 Swift 代码。一、语言参考在整本书中的定位《Swift 编程语言》全书分为语言指南Language Guide与语言参考Language Reference两大部分顶层索引见 The-Swift-Programming-Language.md 的 Topics 列表语言指南面向日常开发按主题讲解 Swift 的用法例如 TheBasics、StringsAndCharacters、Generics 等特点是大量代码示例与实战讲解。语言参考面向精确理解语言本身按语法范畴组织包括 AboutTheLanguageReference、LexicalStructure、Types、Expressions、Statements、Declarations、Attributes、Patterns、GenericParametersAndArguments 等章节。语言参考的语法描述有一个重要前提原文明确指出这里描述的语法旨在帮助你更深入地理解 Swift 语言的特性而不是让你直接实现相关的解析器或编译器。也就是说书中给出的语法规则是教学性而非工程规范——它是为了让人类读者更清楚地理解 Swift 的结构而不是一份可以直接交付给 parser generator 的完整 BNF 规范。为什么 Swift 的语言看起来如此精简《关于语言参考》特别解释了一个现象与其他语言相比Swift 的语言本身相对精简。这是因为 Swift 代码中大量常用的类型、函数和运算符实际上定义在Swift 标准库中而非语言本身。例如数字、字符、字符串等看似原始的类型实际上是在 Swift 标准库中通过结构体定义和实现的命名类型详见 Types 开头运算符如、等是在标准库中作为运算符函数定义的集合类型如Array、Dictionary、Optional也都是标准库中的命名类型。它们虽然不是语言语法的一部分却在全书讨论与代码示例中被广泛使用。理解这一点有助于区分语言规则与库能力语言参考只描述语法结构本身而标准库的丰富性使 Swift 语法保持紧凑。二、语法标注的六条核心约定《关于语言参考》用一个小节如何阅读语法完整定义了全书语法框的阅读规则。这些约定是阅读语言参考的钥匙逐条说明如下。1. 箭头→标记语法生成规则箭头读作可以由……组成can be composed of。箭头左侧是一个语法类别右侧是该类别的一种或多种构成方式。例如 词法结构 中的空白规则whitespace→whitespace-itemwhitespace?whitespace-item→line-breakwhitespace-item→inline-spacewhitespace-item→commentwhitespace-item→multiline-commentwhitespace-item→ U0000、U000B 或 U000C第一条规则读作空白whitespace可以由一个空白项whitespace-item后跟一个可选的空白组成——这是一个递归定义表示空白是零个或多个空白项组成的序列。2. 斜体文本语法类别语法类别syntactic category以斜体表示出现在语法生成规则的两边。它们通常是语言结构的概念名例如whitespace、identifier、literal词法层面statement、loop-statement、branch-statement语句层面type、function-type、tuple-type类型层面declaration、variable-declaration、getter-setter-block声明层面在规则右侧出现的斜体类别表示该位置可以进一步展开为其他规则从而形成层级化的语法描述体系。3. 加粗等宽字体字面单词和标点符字面单词与标点符号用加粗等宽字体表示并且仅出现在语法生成规则的右侧。它们代表必须原样书写的 Swift 关键字、符号或标点。例如 语句 中 for-in 语句的语法for-in-statement→forcase?patterninexpressionwhere-clause?code-block这里的for和in是必须原样写出的关键字而case?表示case这个关键字本身是可选的对应for case let x in ...这种模式匹配循环。4. 竖线|分隔可选的生成规则当某个语法类别有多种合法构成方式时用竖线分隔各备选项。例如 声明 中 getter-setter 代码块的完整语法getter-setter-block→code-blockgetter-setter-block→{getter-clausesetter-clause?}getter-setter-block→{setter-clausegetter-clause}这表示 getter-setter 代码块有三种形态要么是一个普通代码块要么是getter 子句 可选 setter 子句要么是setter 子句 getter 子句后者是计算属性只写 getter 与 setter 顺序的另一种合法排列。《关于语言参考》特别强调当可选的生成规则过长而难以阅读时它们会被拆分为多行新的语法生成规则。也就是说竖线分隔的备选项在排版时可以被摊平成多条独立的生成规则二者语义等价。5. 普通字体文本描述右侧内容的少数情况在极少数情况下语法生成规则右侧会使用普通字体文本来描述内容而不是给出精确的记号序列。这通常用于难以逐字列举的场景例如 词法结构 中的line-break→ U000Aline-break→ U000Dline-break→ U000D 后跟 U000A右侧的U000A换行符、U000D回车符等即属于用普通文本直接描述字符的做法。6. 后缀问号?标记可选部分可选的语法类别和字面量由后缀问号?标记在排版中常表现为类别名后的斜体下标问号如setter-clause?。它表示该部分可以出现也可以不出现。例如 泛型形参和实参 中的泛型形参子句语法泛型形参子句→泛型形参列表,?这里,?表示形参列表之后的逗号是可选的即既允许T, U也允许T U尽管实际书写时通常带逗号。三、逐条解读示例getter-setter 代码块《关于语言参考》用 getter-setter 代码块的语法定义作为贯穿示例我们对照原文逐行分析getter-setter-block→{getter-clausesetter-clause?}|{setter-clausegetter-clause}这条规则读作getter-setter 代码块可以是——左大括号{后跟一个getter-clause再跟一个可选的setter-clause即setter-clause?最后是右大括号}或者竖线|左大括号后跟setter-clause再跟getter-clause最后是右大括号。原文指出这条规则等价于下面两条显式列出的生成规则备选项被拆开getter-setter-block→{getter-clausesetter-clause?}getter-setter-block→{setter-clausegetter-clause}在 声明 一章的变量声明的语法中getter-setter-block被进一步展开为三层细节完整呈现了该示例在真实章节中的落地形态getter-clause→attributes?mutation-modifier?getcode-blocksetter-clause→attributes?mutation-modifier?setsetter-name?code-blocksetter-name→(identifier)即getter 子句由可选的特性和可选的变更修饰符如mutating或nonmutating、关键字get以及一个代码块组成setter 子句类似但set之后还可以跟一个可选的setter 名称括号括起的标识符用于在 setter 内引用新值。这套规则对应的 Swift 代码如下var stored: Int { // getter-setter 代码块get 后跟可选 set get { return _stored } set(newValue) { _stored newValue } } var computed: Int { // 同样合法get setset 使用隐式 newValue get { return 42 } set { _ newValue } }同时变量声明 中还有与之平行的getter-setter-keyword-block和willSet-didSet-block规则展示了 Swift 计算属性与属性观察器在语法层面的完整形态。四、语言参考的章节结构与语法体系理解标注约定之后我们再纵览语言参考各章如何用这套体系描述 Swift。整本参考从最小单元到完整结构层层递进词法层LexicalStructure描述哪些字符序列构成合法标记tokens。该章覆盖空白与注释、标识符、关键字和标点符号、字面量、运算符等并说明最长匹配策略longest match——标记生成时总是取输入文本中最长的可能子串。标识符的语法规则展示了递归与 Unicode 范围描述的用法identifier→identifier-headidentifier-characters?identifier→identifier-headidentifier-characters?identifier→implicit-parameter-nameidentifier→property-wrapper-projection这解释了为何反引号可以转义保留字class是合法标识符而class不是以及$0、$1等隐式参数名和$前缀的属性包装器投影标识符为何在语法上被单独建模。类型层Types描述 Swift 的类型系统包括命名类型与复合类型。开篇的类型语法规则用了与 getter-setter 示例完全相同的竖线备选项风格type→function-typetype→array-typetype→dictionary-typetype→type-identifiertype→tuple-typetype→optional-typetype→implicitly-unwrapped-optional-typetype→protocol-composition-typetype→opaque-typetype→boxed-protocol-typetype→metatype-typetype→any-typetype→self-typetype→(type)值得注意的是括号规则(type)允许在任意类型外加括号且添加括号不会产生任何影响例如(Int)与Int等价。类型注解的语法则是后置可选修饰的典型type-annotation→:attributes?type即冒号后先跟可选特性列表再跟类型。语句层Statements描述语句如何分组表达式并控制执行流程。开篇的语句语法将七种语句与可选分号组合在一起statement→expression;?statement→declaration;?statement→loop-statement;?statement→branch-statement;?statement→labeled-statement;?statement→control-transfer-statement;?statement→defer-statement;?statement→do-statement;?statement→compiler-control-statement这解释了原文所述是否在语句末尾加分号是可选的但同一行写多条独立语句时必须使用分号的语法依据每条语句规则右侧都以;?结尾。声明层Declarations描述类、结构体、函数、变量等声明的语法。变量声明的多条生成规则展示了备选项过多则拆分为多行的约定variable-declaration→variable-declaration-headpattern-initializer-listvariable-declaration→variable-declaration-headvariable-nametype-annotationcode-blockvariable-declaration→variable-declaration-headvariable-nametype-annotationgetter-setter-blockvariable-declaration→variable-declaration-headvariable-nametype-annotationgetter-setter-keyword-blockvariable-declaration→variable-declaration-headvariable-nameinitializerwillSet-didSet-blockvariable-declaration→variable-declaration-headvariable-nametype-annotationinitializer?willSet-didSet-block普通变量、计算属性getter-setter、带属性观察器的存储属性willSet/didSet在语法上被区分为不同的生成规则与语言指南中 Properties 的讲解一一对应。表达式层与特性层Expressions 与 Attributes表达式章节包含了全书最密集的语法框从 in-out 表达式、中缀表达式、赋值运算符、条件运算符、类型转换运算符到闭包表达式、键路径表达式、宏展开表达式、强制取值表达式等共二十余条 Grammar of ... 规则。例如in-out-expression→expression特性章节则说明特性attribute通过符号书写可带参数且附加宏attached macro与属性包装器也复用特性语法#attribute name# #attribute name#(#attribute arguments#)泛型层GenericParametersAndArguments泛型形参子句的语法规则同时用到了竖线备选项与可选问号泛型形参子句→泛型形参列表,?泛型形参列表→泛型形参|泛型形参,泛型形参列表泛型形参→类型名称泛型形参→类型名称:类型标识符泛型形参→类型名称:协议合成类型泛型形参→let类型名称:类型注意泛型形参列表的规则是右递归的列表项后跟逗号再跟列表这与whitespace、statements的递归写法同构是全书语法体系中列表的标准建模方式。五、从语法规则还原 Swift 代码的实战方法掌握了标注约定之后你可以按以下步骤将任意一条语法规则翻译为可编译的 Swift 代码定位字面量找出所有加粗等宽字体记号它们是必须原样书写的部分关键字、括号、逗号、运算符等展开斜体类别把每个斜体类别沿其自身的生成规则逐层展开直到只剩下字面量与普通文本处理可选与备选对带?的部分决定出现或不出现对竖线|分隔的备选项选择其中一种合法形态用语言指南对照验证把还原出的代码与对应主题的 语言指南 章节示例对照确认语义一致。以 for-in 语句规则为例for-in-statement→forcase?patterninexpressionwhere-clause?code-block去掉可选项、展开pattern、expression、code-block后还原出最常见的形态for item in collection { // code-block }若保留case与where-clause则还原出带条件过滤的模式匹配循环for case let (x, y) in points where x 0 { // 仅当 x 0 时执行 }再如 词法结构 中的多行注释规则multiline-comment→/*multiline-comment-text*/multiline-comment-text-item→multiline-commentmultiline-comment-text-item可以展开为multiline-comment说明多行注释可以嵌套/* /* */ */合法且必须头尾匹配这是语法递归建模的直接推论。六、使用中文版语言参考的注意事项中文版与英文原版章节一一对应本仓库的 ReferenceManual 目录下每个文件对应英文原版《The Swift Programming Language》语言参考的一章章节标题与语法框编号保持一致便于对照查阅。语法框使用块引用排版全书所有语法规则均以块引用形式呈现标题如 Grammar of a getter-setter block:、语句语法、泛型形参子句的语法格式。阅读时注意中文版部分章节如 GenericParametersAndArguments直接沿用了泛型形参一致性要求等译名规则内容与原版一致。斜体与下划线下标在纯文本中的表示中文版在 Markdown 中以*类别*表示斜体语法类别可选的?常写作类别名后的_?_如setter-clause?与原文的斜体下标问号含义相同。标准库与语言的区分阅读时牢记《关于语言参考》开篇的说明——Int、String、Array、运算符函数等属于标准库而非语言语法语言参考不描述它们但不影响代码示例的理解。语法框是参考而非规范书中语法服务于理解而非实现编译器若发现个别边界情况如 Statements 源码注释中提到的分号语句取舍应以实际 Swift 编译器行为为准。七、小结《关于语言参考》虽然篇幅不长却是进入整个语言参考部分的第一道门。六条标注约定——箭头、斜体类别、加粗等宽字面量、竖线备选项、普通文本描述、可选问号——构成了全书数百条语法生成规则统一的元语言。掌握这套约定后无论是 LexicalStructure 中的 Unicode 字符区间还是 Declarations 中层层嵌套的 getter-setter 规则都能被准确解读并还原为真实可运行的 Swift 代码。这份导读本身也正是理解 Swift 语法精简本质的起点语言规则的精简恰恰源于标准库的丰富与语法描述的层次化。【免费下载链接】the-swift-programming-language-in-chinese中文版 Apple 官方《Swift 编程语言》项目地址: https://gitcode.com/gh_mirrors/th/the-swift-programming-language-in-chinese创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考