Compare commits
8 Commits
feature/Ch
...
Ch-Lexical
| Author | SHA1 | Date | |
|---|---|---|---|
| e82d019942 | |||
| 872d7af8a3 | |||
| 24d88f684a | |||
| a15735f51b | |||
| aba2a5fb55 | |||
| 096f2acfc4 | |||
| 8b99054c0c | |||
| d9d2952e85 |
@ -114,7 +114,7 @@ print("\(numberOfChoices) beverages available")
|
|||||||
// 打印“3 beverages available”
|
// 打印“3 beverages available”
|
||||||
```
|
```
|
||||||
|
|
||||||
在前面的例子中,通过 `Beverage.allCases` 可以访问到包含 `Beverage` 枚举所有成员的集合。`allCases` 的使用方法和其它一般集合一样——集合中的元素是枚举类型的实例,所以在上面的情况中,这些元素是 `Beverage` 值。在前面的例子中,统计了总共有多少个枚举成员。而在下面的例子中,则使用 `for` 循环来遍历所有枚举成员。
|
在前面的例子中,通过 `Beverage.allCases` 可以访问到包含 `Beverage` 枚举所有成员的集合。`allCases` 的使用方法和其它一般集合一样——集合中的元素是枚举类型的实例,所以在上面的情况中,这些元素是 `Beverage` 值。在前面的例子中,统计了总共有多少个枚举成员。而在下面的例子中,则使用 `for-in` 循环来遍历所有枚举成员。
|
||||||
|
|
||||||
```swift
|
```swift
|
||||||
for beverage in Beverage.allCases {
|
for beverage in Beverage.allCases {
|
||||||
|
|||||||
@ -32,6 +32,10 @@ Swift 中结构体和类有很多共同点。两者都可以:
|
|||||||
|
|
||||||
类支持的附加功能是以增加复杂性为代价的。作为一般准则,优先使用结构体,因为它们更容易理解,仅在适当或必要时才使用类。实际上,这意味着你的大多数自定义数据类型都会是结构体和枚举。更多详细的比较参见 [在结构和类之间进行选择](https://developer.apple.com/documentation/swift/choosing_between_structures_and_classes)。
|
类支持的附加功能是以增加复杂性为代价的。作为一般准则,优先使用结构体,因为它们更容易理解,仅在适当或必要时才使用类。实际上,这意味着你的大多数自定义数据类型都会是结构体和枚举。更多详细的比较参见 [在结构和类之间进行选择](https://developer.apple.com/documentation/swift/choosing_between_structures_and_classes)。
|
||||||
|
|
||||||
|
> 注意
|
||||||
|
>
|
||||||
|
> 类和 actors 共享很多特性。更多信息请参见 [并发](./28_Concurrency.md)。
|
||||||
|
|
||||||
### 类型定义的语法 {#definition-syntax}
|
### 类型定义的语法 {#definition-syntax}
|
||||||
|
|
||||||
结构体和类有着相似的定义方式。你通过 `struct` 关键字引入结构体,通过 `class` 关键字引入类,并将它们的具体定义放在一对大括号中:
|
结构体和类有着相似的定义方式。你通过 `struct` 关键字引入结构体,通过 `class` 关键字引入类,并将它们的具体定义放在一对大括号中:
|
||||||
|
|||||||
@ -1036,7 +1036,7 @@ class SomeClass {
|
|||||||
```swift
|
```swift
|
||||||
struct Chessboard {
|
struct Chessboard {
|
||||||
let boardColors: [Bool] = {
|
let boardColors: [Bool] = {
|
||||||
var temporaryBoard = [Bool]()
|
var temporaryBoard: [Bool] = []
|
||||||
var isBlack = false
|
var isBlack = false
|
||||||
for i in 1...8 {
|
for i in 1...8 {
|
||||||
for j in 1...8 {
|
for j in 1...8 {
|
||||||
|
|||||||
@ -97,7 +97,7 @@ class Person {
|
|||||||
|
|
||||||
```swift
|
```swift
|
||||||
class Residence {
|
class Residence {
|
||||||
var rooms = [Room]()
|
var rooms: [Room] = []
|
||||||
var numberOfRooms: Int {
|
var numberOfRooms: Int {
|
||||||
return rooms.count
|
return rooms.count
|
||||||
}
|
}
|
||||||
|
|||||||
@ -141,7 +141,7 @@ Swift 为不确定类型提供了两种特殊的类型别名:
|
|||||||
这里有个示例,使用 `Any` 类型来和混合的不同类型一起工作,包括函数类型和非类类型。它创建了一个可以存储 `Any` 类型的数组 `things`:
|
这里有个示例,使用 `Any` 类型来和混合的不同类型一起工作,包括函数类型和非类类型。它创建了一个可以存储 `Any` 类型的数组 `things`:
|
||||||
|
|
||||||
```swift
|
```swift
|
||||||
var things = [Any]()
|
var things: [Any] = []
|
||||||
|
|
||||||
things.append(0)
|
things.append(0)
|
||||||
things.append(0.0)
|
things.append(0.0)
|
||||||
|
|||||||
@ -30,7 +30,7 @@ print("We're number \(one)!")
|
|||||||
>
|
>
|
||||||
> 如果你写过并发和多线程的代码,内存访问冲突也许是同样的问题。然而,这里访问冲突的讨论是在单线程的情境下讨论的,并没有使用并发或者多线程。
|
> 如果你写过并发和多线程的代码,内存访问冲突也许是同样的问题。然而,这里访问冲突的讨论是在单线程的情境下讨论的,并没有使用并发或者多线程。
|
||||||
>
|
>
|
||||||
> 如果你曾经在单线程代码里有访问冲突,Swift 可以保证你在编译或者运行时会得到错误。对于多线程的代码,可以使用 [Thread Sanitizer](https://developer.apple.com/documentation/code_diagnostics/thread_sanitizer) 去帮助检测多线程的冲突。
|
> 如果你曾经在单线程代码里有访问冲突,Swift 可以保证你在编译或者运行时会得到错误。对于多线程的代码,可以使用 [Thread Sanitizer](https://developer.apple.com/documentation/xcode/diagnosing_memory_thread_and_crash_issues_early) 去帮助检测多线程的冲突。
|
||||||
|
|
||||||
### 内存访问性质 {#characteristics-of-memory-access}
|
### 内存访问性质 {#characteristics-of-memory-access}
|
||||||
|
|
||||||
|
|||||||
1
source/02_language_guide/28_Concurrency.md
Normal file
1
source/02_language_guide/28_Concurrency.md
Normal file
@ -0,0 +1 @@
|
|||||||
|
# 并发
|
||||||
@ -6,7 +6,7 @@ Swift 的*“词法结构(lexical structure)”* 描述了能构成该语言
|
|||||||
|
|
||||||
## 空白与注释 {#whitespace}
|
## 空白与注释 {#whitespace}
|
||||||
|
|
||||||
空白(whitespace)有两个用途:分隔源文件中的符号以及帮助区分运算符属于前缀还是后缀(参见 [运算符](#operators)),在其他情况下空白则会被忽略。以下的字符会被当作空白:空格(U+0020)、换行符(U+000A)、回车符(U+000D)、水平制表符(U+0009)、垂直制表符(U+000B)、换页符(U+000C)以及空字符(U+0000)。
|
空白(whitespace)有两个用途:分隔源文件中的符号和区分前缀、后缀和二元运算符(参见 [运算符](#operators)),在其他情况下空白则会被忽略。以下的字符会被当作空白:空格(U+0020)、换行符(U+000A)、回车符(U+000D)、水平制表符(U+0009)、垂直制表符(U+000B)、换页符(U+000C)以及空字符(U+0000)。
|
||||||
|
|
||||||
注释被编译器当作空白处理。单行注释由 `//` 开始直至遇到换行符(U+000A)或者回车符(U+000D)。多行注释由 `/*` 开始,以 `*/` 结束。多行注释允许嵌套,但注释标记必须成对出现。
|
注释被编译器当作空白处理。单行注释由 `//` 开始直至遇到换行符(U+000A)或者回车符(U+000D)。多行注释由 `/*` 开始,以 `*/` 结束。多行注释允许嵌套,但注释标记必须成对出现。
|
||||||
|
|
||||||
|
|||||||
@ -23,6 +23,7 @@
|
|||||||
* [析构过程](02_language_guide/15_Deinitialization.md)
|
* [析构过程](02_language_guide/15_Deinitialization.md)
|
||||||
* [可选链](02_language_guide/16_Optional_Chaining.md)
|
* [可选链](02_language_guide/16_Optional_Chaining.md)
|
||||||
* [错误处理](02_language_guide/17_Error_Handling.md)
|
* [错误处理](02_language_guide/17_Error_Handling.md)
|
||||||
|
* [并发](02_language_guide/28_Concurrency.md)
|
||||||
* [类型转换](02_language_guide/18_Type_Casting.md)
|
* [类型转换](02_language_guide/18_Type_Casting.md)
|
||||||
* [嵌套类型](02_language_guide/19_Nested_Types.md)
|
* [嵌套类型](02_language_guide/19_Nested_Types.md)
|
||||||
* [扩展](02_language_guide/20_Extensions.md)
|
* [扩展](02_language_guide/20_Extensions.md)
|
||||||
|
|||||||
Reference in New Issue
Block a user