7 Commits

Author SHA1 Message Date
005a502462 Update 09_Structures_And_Classes.md 2021-06-22 10:55:39 -05:00
f2771ba9fc fix:修改 SUMMARY.md 2021-06-22 23:50:48 +08:00
529a89b80b feat:新建「并发」章节 md 文件 2021-06-22 23:47:07 +08:00
51a54f10ef feat:新增 note 一句 2021-06-22 23:42:31 +08:00
64abdbff70 Revert "feat:添加 note,新建「并发」章节的 md 文件,修改文件顺序"
This reverts commit 898930b0ec.

# Conflicts:
#	source/02_language_guide/18_Concurrency.md
2021-06-22 23:38:15 +08:00
40172abfbe fix:删除冗余的字符串 2021-06-20 19:14:51 +08:00
898930b0ec feat:添加 note,新建「并发」章节的 md 文件,修改文件顺序 2021-06-20 19:05:32 +08:00
8 changed files with 15 additions and 20 deletions

View File

@ -1,13 +1,11 @@
# 版本兼容性 # 版本兼容性
本书描述的是在 Xcode 13 中默认包含的 Swift 5.5 版本。你可以使用 Xcode 13 来构建 Swift 5.5、Swift 4.2 或 Swift 4 写的项目。 本书描述的是在 Xcode 12默认 Swift 版本 Swift 5.3。你可以使用 Xcode 12 来构建 Swift 5.3、Swift 4.2 或 Swift 4 写的项目。
使用 Xcode 13 构建 Swift 4 和 Swift 4.2 代码时Swift 5.5 的大多数功能都适用。但以下功能仅支持 Swift 5.5 或更高版本: 当您使用 Xcode 12 构建 Swift 4 和 Swift 4.2 代码时Swift 5.3 的大多数功能都适用。但以下功能仅支持 Swift 5.3 或更高版本:
* 返回值是不透明类型的函数依赖 Swift 5.1 运行时。 * 返回值是不透明类型的函数依赖 Swift 5.1 运行时。
* **try?** 表达式不会为已返回可选类型的代码引入额外的可选类型层级。 * **try?** 表达式不会为已返回可选类型的代码引入额外的可选类型层级。
* 大数字的整型字面量初始化代码的类型将会被正确推导,例如 **UInt64(0xffff_ffff_ffff_ffff)** 将会被推导为整型类型而非溢出。 * 大数字的整型字面量初始化代码的类型将会被正确推导,例如 **UInt64(0xffff_ffff_ffff_ffff)** 将会被推导为整型类型而非溢出。
并发特性需要 Swift 5.5 及以上版本,以及一个提供了并发相关类型的 Swift 标准库版本。要应用于苹果平台,请至少将部署版本设置为 iOS 15、macOS 12、tvOS 15 或 watchOS 8.0 Swift 5.3 写的项目可以依赖用 Swift 4.2 或 Swift 4 写的项目反之亦然。这意味着如果你将一个大的项目分解成多个框架framework你可以逐个地将框架从 Swift 4 代码迁移到 Swift 5.3
用 Swift 5.5 写的项目可以依赖用 Swift 4.2 或 Swift 4 写的项目反之亦然。这意味着如果你将一个大的项目分解成多个框架framework你可以逐个地将框架从 Swift 4 代码迁移到 Swift 5.5。

View File

@ -97,8 +97,8 @@ print(shoppingList)
使用初始化语法来创建一个空数组或者空字典。 使用初始化语法来创建一个空数组或者空字典。
```swift ```swift
let emptyArray: [String] = [] let emptyArray = [String]()
let emptyDictionary: [String: Float] = [:] let emptyDictionary = [String: Float]()
``` ```
如果类型信息可以被推断出来,你可以用 `[]``[:]` 来创建空数组和空字典——比如,在给变量赋新值或者给函数传参数的时候。 如果类型信息可以被推断出来,你可以用 `[]``[:]` 来创建空数组和空字典——比如,在给变量赋新值或者给函数传参数的时候。
@ -187,7 +187,7 @@ let interestingNumbers = [
"Square": [1, 4, 9, 16, 25], "Square": [1, 4, 9, 16, 25],
] ]
var largest = 0 var largest = 0
for (_, numbers) in interestingNumbers { for (kind, numbers) in interestingNumbers {
for number in numbers { for number in numbers {
if number > largest { if number > largest {
largest = number largest = number
@ -195,12 +195,11 @@ for (_, numbers) in interestingNumbers {
} }
} }
print(largest) print(largest)
// 输出 "25"
``` ```
> 练习 > 练习
> >
> 将 _ 替换成变量名,以确定哪种类型的值是最大的 > 添加另一个变量来记录最大数字的种类kind同时仍然记录这个最大数字的值
使用 `while` 来重复运行一段代码直到条件改变。循环条件也可以在结尾,保证能至少循环一次。 使用 `while` 来重复运行一段代码直到条件改变。循环条件也可以在结尾,保证能至少循环一次。
@ -772,7 +771,7 @@ print(fridgeIsOpen)
```swift ```swift
func makeArray<Item>(repeating item: Item, numberOfTimes: Int) -> [Item] { func makeArray<Item>(repeating item: Item, numberOfTimes: Int) -> [Item] {
var result: [Item] = [] var result = [Item]()
for _ in 0..<numberOfTimes { for _ in 0..<numberOfTimes {
result.append(item) result.append(item)
} }

View File

@ -37,7 +37,7 @@ Swift 中数组的完整写法为 `Array<Element>`,其中 `Element` 是这个
你可以使用构造语法来创建一个由特定数据类型构成的空数组: 你可以使用构造语法来创建一个由特定数据类型构成的空数组:
```swift ```swift
var someInts: [Int] = [] var someInts = [Int]()
print("someInts is of type [Int] with \(someInts.count) items.") print("someInts is of type [Int] with \(someInts.count) items.")
// 打印“someInts is of type [Int] with 0 items.” // 打印“someInts is of type [Int] with 0 items.”
``` ```
@ -473,7 +473,7 @@ Swift 的字典使用 `Dictionary<Key, Value>` 定义,其中 `Key` 是一种
你可以像数组一样使用构造语法创建一个拥有确定类型的空字典: 你可以像数组一样使用构造语法创建一个拥有确定类型的空字典:
```swift ```swift
var namesOfIntegers: [Int: String] = [:] var namesOfIntegers = [Int: String]()
// namesOfIntegers 是一个空的 [Int: String] 字典 // namesOfIntegers 是一个空的 [Int: String] 字典
``` ```

View File

@ -97,8 +97,6 @@ for tickMark in stride(from: 3, through: hours, by: hourInterval) {
} }
``` ```
以上示例使用 `for-in` 循环来遍历范围、数组、字典和字符串。你可以用它来遍历任何的集合,包括实现了 [Sequence](https://developer.apple.com/documentation/swift/sequence) 协议的自定义类或集合类型。
## While 循环 {#while-loops} ## While 循环 {#while-loops}
`while` 循环会一直运行一段语句直到条件变成 `false`。这类循环适合使用在第一次迭代前迭代次数未知的情况下。Swift 提供两种 `while` 循环形式: `while` 循环会一直运行一段语句直到条件变成 `false`。这类循环适合使用在第一次迭代前迭代次数未知的情况下。Swift 提供两种 `while` 循环形式:

View File

@ -113,13 +113,13 @@ reversedNames = names.sorted(by: { s1, s2 in s1 > s2 } )
Swift 自动为内联闭包提供了参数名称缩写功能,你可以直接通过 `$0``$1``$2` 来顺序调用闭包的参数,以此类推。 Swift 自动为内联闭包提供了参数名称缩写功能,你可以直接通过 `$0``$1``$2` 来顺序调用闭包的参数,以此类推。
如果你在闭包表达式中使用参数名称缩写,你可以在闭包定义中省略参数列表,并且对应参数名称缩写的类型会通过函数类型进行推断。闭包接受的参数的数量取决于所使用的缩写参数的最大编号。`in` 关键字也同样可以被省略,因为此时闭包表达式完全由闭包函数体构成: 如果你在闭包表达式中使用参数名称缩写,你可以在闭包定义中省略参数列表,并且对应参数名称缩写的类型会通过函数类型进行推断。`in` 关键字也同样可以被省略,因为此时闭包表达式完全由闭包函数体构成:
```swift ```swift
reversedNames = names.sorted(by: { $0 > $1 } ) reversedNames = names.sorted(by: { $0 > $1 } )
``` ```
在这个例子中,`$0``$1` 表示闭包中第一个和第二个 `String` 类型的参数。因为 `$1` 是编号最大的缩写参数,所以可以理解为:该闭包需要两个参数。这里的 `sorted(by:)` 函数希望得到一个参数都是字符串的闭包,因此缩写参数 `$0``$1` 的类型均为 `String` 在这个例子中,`$0``$1` 表示闭包中第一个和第二个 `String` 类型的参数。
### 运算符方法 {#operator-methods} ### 运算符方法 {#operator-methods}

View File

@ -114,7 +114,7 @@ print("\(numberOfChoices) beverages available")
// 打印“3 beverages available” // 打印“3 beverages available”
``` ```
在前面的例子中,通过 `Beverage.allCases` 可以访问到包含 `Beverage` 枚举所有成员的集合。`allCases` 的使用方法和其它一般集合一样——集合中的元素是枚举类型的实例,所以在上面的情况中,这些元素是 `Beverage` 值。在前面的例子中,统计了总共有多少个枚举成员。而在下面的例子中,则使用 `for-in` 循环来遍历所有枚举成员。 在前面的例子中,通过 `Beverage.allCases` 可以访问到包含 `Beverage` 枚举所有成员的集合。`allCases` 的使用方法和其它一般集合一样——集合中的元素是枚举类型的实例,所以在上面的情况中,这些元素是 `Beverage` 值。在前面的例子中,统计了总共有多少个枚举成员。而在下面的例子中,则使用 `for` 循环来遍历所有枚举成员。
```swift ```swift
for beverage in Beverage.allCases { for beverage in Beverage.allCases {

View File

@ -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 {

View File

@ -30,7 +30,7 @@ print("We're number \(one)!")
> >
> 如果你写过并发和多线程的代码,内存访问冲突也许是同样的问题。然而,这里访问冲突的讨论是在单线程的情境下讨论的,并没有使用并发或者多线程。 > 如果你写过并发和多线程的代码,内存访问冲突也许是同样的问题。然而,这里访问冲突的讨论是在单线程的情境下讨论的,并没有使用并发或者多线程。
> >
> 如果你曾经在单线程代码里有访问冲突Swift 可以保证你在编译或者运行时会得到错误。对于多线程的代码,可以使用 [Thread Sanitizer](https://developer.apple.com/documentation/xcode/diagnosing_memory_thread_and_crash_issues_early) 去帮助检测多线程的冲突。 > 如果你曾经在单线程代码里有访问冲突Swift 可以保证你在编译或者运行时会得到错误。对于多线程的代码,可以使用 [Thread Sanitizer](https://developer.apple.com/documentation/code_diagnostics/thread_sanitizer) 去帮助检测多线程的冲突。
### 内存访问性质 {#characteristics-of-memory-access} ### 内存访问性质 {#characteristics-of-memory-access}