2
2
3
3
引入类型、运算符、变量以及其他名称和构造。
4
4
5
- 一个 * 声明* 将一个新名称或构造引入到你的程序中。例如 ,你使用声明来引入函数和方法,引入变量和常量,以及定义枚举、结构体、类和协议类型。你还可以使用声明来扩展现有具名类型的行为,并将其他地方声明的符号引入到你的程序中。
5
+ * 声明* 将在程序中引入一个新的名称或构造例如 ,你使用声明来引入函数和方法,引入变量和常量,以及定义枚举、结构体、类和协议类型。你还可以使用声明来扩展现有具名类型的行为,并将其他地方声明的符号引入到你的程序中。
6
6
7
- 在 Swift 中,大多数声明也是定义,因为它们在声明的同时被实现或初始化。也就是说,由于协议不实现其成员,大多数协议成员仅仅是声明 。为了方便起见,并且因为在 Swift 中这种区别并不是那么重要,术语 * 声明* 涵盖了声明和定义 。
7
+ 在 Swift 中,大多数声明也是定义,因为它们在声明的同时被实现或初始化。但由于协议不实现它的成员,所以协议成员在此仅仅是声明 。为了方便起见,而且这种区别在 Swift 中没那么重要,所以术语 * 声明* 涵盖了声明和定义两种含义 。
8
8
9
9
> 声明的语法:
10
10
>
28
28
29
29
## 顶级代码
30
30
31
- Swift 源文件中的顶级代码由零个或多个语句、声明和表达式组成。默认情况下,在源文件顶层声明的变量、常量和其他具名声明可以被同一模块中每个源文件的代码访问。你可以通过使用访问级别修饰符来覆盖此默认行为 ,具体说明见 < doc:Declarations#Access-Control-Levels > 。
31
+ Swift 源文件中的顶级代码由零个或多个语句、声明和表达式组成。默认情况下,在源文件顶层声明的变量、常量和其他具名声明可以被同一模块中每个源文件的代码访问。你可以使用访问级别修饰符来覆盖此默认行为 ,具体说明见 < doc:Declarations#Access-Control-Levels > 。
32
32
33
33
有两种类型的顶级代码:顶级声明和可执行的顶级代码。顶级声明仅由声明组成,允许出现在所有 Swift 源文件中。可执行的顶级代码包含语句和表达式,而不仅仅是声明,仅允许作为程序的顶级入口点。
34
34
35
- 你编译的 Swift 代码可以包含最多以下一种方法来标记顶级入口点,无论代码如何组织成文件和模块 :` main ` 特性, ` NSApplicationMain ` 特性, ` UIApplicationMain ` 特性, ` main.swift ` 文件,或包含顶级可执行代码的文件。
35
+ 编译 Swift 代码生成可执行文件时,无论文件和模块中的代码如何组织,都只能通过以下方法之一来指定顶级入口点 :` main ` 特性、 ` NSApplicationMain ` 特性、 ` UIApplicationMain ` 特性、 ` main.swift ` 文件,或包含顶级可执行代码的文件。
36
36
37
37
> 顶级声明的语法:
38
38
>
@@ -69,7 +69,7 @@ Swift 源文件中的顶级代码由零个或多个语句、声明和表达式
69
69
import <#module#>
70
70
```
71
71
72
- 提供更多细节可以限制导入哪些符号——你可以指定特定的子模块或模块或子模块内的特定声明。当使用这种详细形式时,只有被导入的符号(而非声明它的模块)在当前作用域中可用 。
72
+ 提供更多细节可以限制导入哪些符号——可以指定特定的子模块,也可以指定模块或子模块中特定的声明。使用这种限制后,在当前作用域中,只有被导入的符号是可用的,而不是整个模块中的所有声明 。
73
73
74
74
``` swift
75
75
import <#import kind#> <#module#>.<#symbol name#>
@@ -97,10 +97,10 @@ let <#constant name#>: <#type#> = <#expression#>
97
97
98
98
常量声明定义了* 常量名称* 与构造器* 表达式* 的值之间的不可变绑定;一旦常量的被赋值,就无法更改。也就是说,如果常量是用类对象初始化的,对象本身可以改变,但常量名称与它所指向的对象之间的绑定不能改变。
99
99
100
- 当在全局范围内声明常量时,必须用一个值进行初始化。当在函数或方法的上下文中发生常量声明时 ,可以稍后初始化,只要保证在第一次读取其值之前已为其赋值。如果编译器能够证明常量的值从未被读取,则不要求该常量必须设置值 。此分析称为* 确定初始化* ——编译器保证一个值在读取之前值已被赋值。
100
+ 当常量声明在全局作用域时,常量必须赋值。当常量声明在函数或者方法的上下文中时 ,可以稍后初始化,只要保证在第一次读取其值之前已为其赋值。如果编译器能够证明常量的值从未被读取,则不要求该常量必须赋值 。此分析称为* 确定初始化* ——编译器保证一个值在读取之前值已被赋值。
101
101
102
102
> 注意:
103
- > 确定初始化无法构建需要领域知识的证明,并且它在条件语句中跟踪状态的能力是有限的 。如果你可以确定常量始终有一个值,但编译器无法证明这一点,请尝试简化设置该值的代码路径,或改用变量声明。
103
+ > 确定初始化无法分析包含特定领域的内容,并且对条件语句中的状态跟踪能力也有限 。如果你可以确定常量始终有一个值,但编译器无法证明这一点,请尝试简化设置该值的代码路径,或改用变量声明。
104
104
105
105
<!--
106
106
In the most general case,
@@ -110,7 +110,7 @@ as shown by Rice's theorem.
110
110
111
111
当常量声明出现在类或结构体声明的上下文中时,它被视为一个* 常量属性* 。常量声明不是计算属性,因此没有 getter 或 setter。
112
112
113
- 如果常量声明的 * 常量名称* 是一个元组模式,则元组中每个项的名称都绑定到构造器 * 表达式* 中相应的值 。
113
+ 如果 * 常量名称* 是元组形式,元组中每一项的名称都会和初始化 * 表达式* 中对应的值进行绑定 。
114
114
115
115
``` swift
116
116
let (firstNumber, secondNumber) = (10 , 42 )
@@ -144,9 +144,9 @@ print("The second number is \(secondNumber).")
144
144
```
145
145
-->
146
146
147
- 在常量声明中,当可以推断出* 常量名称* 的类型时,类型注释(` : ` * type* )是可选的,祥见 < doc:Types#Type-Inference > 。
147
+ 在常量声明中,当可以推断出* 常量名称* 的类型时,类型注释(` : ` * type* )是可选的,详见 < doc:Types#Type-Inference > 。
148
148
149
- 要声明一个常量类型属性,请使用 ` static ` 声明修饰符标记该声明。类的常量类型属性总是隐式为 final;你不能使用 ` class ` 或 ` final ` 声明修饰符来允许或禁止子类重写 。类型属性的讨论请参见 < doc:Properties#Type-Properties > 。
149
+ 要声明一个常量类型属性,请使用 ` static ` 声明修饰符标记该声明。类的常量类型属性总是隐式为 final;你无法用 class 或 final 声明修饰符实现允许或禁止被子类重写的目的 。类型属性的讨论请参见 < doc:Properties#Type-Properties > 。
150
150
151
151
<!--
152
152
- test: `class-constants-cant-have-class-or-final`
@@ -178,7 +178,7 @@ print("The second number is \(secondNumber).")
178
178
179
179
* 变量声明* 会在你的程序中引入一个具名的变量值,并使用 ` var ` 关键字进行声明。
180
180
181
- 变量声明有几种形式,用于声明不同类型的具名可变值 ,包括存储变量和计算变量及属性、存储变量和属性观察者,以及静态变量属性。使用何种适当的形式取决于变量声明的范围以及你打算声明的变量类型 。
181
+ 变量声明有多种形式,用于定义各种有名称的、可变的值 ,包括存储变量和计算变量及属性、存储变量和属性观察者,以及静态变量属性。使用哪种形式取决于变量声明的范围以及你打算声明的变量类型 。
182
182
183
183
> 注意:
184
184
> 你还可以在协议声明的上下文中声明属性,参见 < doc:Declarations#Protocol-Property-Declaration > 。
@@ -193,9 +193,9 @@ print("The second number is \(secondNumber).")
193
193
var < #variable name#> : < #type #> = < #expression #>
194
194
```
195
195
196
- 你可以在全局范围、函数的局部范围或类或结构体声明的上下文中定义这种形式的变量声明 。当这种形式的变量声明在全局范围或函数的局部范围内声明时,它被称为* 存储变量* 。当它在类或结构体声明的上下文中声明时,它被称为* 存储变量属性* 。
196
+ 你可以在全局作用域、函数的局部作用域,类或结构体声明的上下文中定义这种形式的变量声明 。当这种形式的变量声明在全局范围或函数的局部范围内声明时,它被称为* 存储变量* 。当它在类或结构体声明的上下文中声明时,它被称为* 存储变量属性* 。
197
197
198
- 构造器* 表达式* 不能出现在协议声明中,但在所有其他上下文中 ,构造器* 表达式* 是可选的。也就是说,如果没有构造器* 表达式* ,变量声明必须包含显式类型注释(` : ` * type* )。
198
+ 构造器* 表达式* 不能出现在协议声明中,但在其他场景下 ,构造器* 表达式* 是可选的。也就是说,如果没有构造器* 表达式* ,变量声明必须包含显式类型注释(` : ` * type* )。
199
199
200
200
与常量声明一样,如果变量声明省略了构造器* 表达式* ,则在第一次读取该变量之前必须为其设置一个值。同样,像常量声明一样,如果* 变量名* 是一个元组模式,则元组中每个项的名称都绑定到构造器* 表达式* 中的相应值。
201
201
0 commit comments