diff --git a/source/chapter2/01_The_Basics.md b/source/chapter2/01_The_Basics.md index ac5a5263..b2eb0fff 100755 --- a/source/chapter2/01_The_Basics.md +++ b/source/chapter2/01_The_Basics.md @@ -1,6 +1,5 @@ # 基础部分 - Swift 是一门开发 iOS, macOS, watchOS 和 tvOS 应用的新语言。然而,如果你有 C 或者 Objective-C 开发经验的话,你会发现 Swift 的很多内容都是你熟悉的。 Swift 包含了 C 和 Objective-C 上所有基础数据类型,`Int` 表示整型值; `Double` 和 `Float` 表示浮点型值; `Bool` 是布尔型值;`String` 是文本型数据。 Swift 还提供了三个基本的集合类型,`Array`、`Set` 和 `Dictionary` ,详见[集合类型](./04_Collection_Types.md)。 diff --git a/source/chapter2/02_Basic_Operators.md b/source/chapter2/02_Basic_Operators.md index 3127b7d1..41456890 100755 --- a/source/chapter2/02_Basic_Operators.md +++ b/source/chapter2/02_Basic_Operators.md @@ -402,7 +402,7 @@ if !allowedEntry { 在示例代码中,小心地选择布尔常量或变量有助于代码的可读性,并且避免使用双重逻辑非运算,或混乱的逻辑语句。 -### 逻辑与运算符 +### 逻辑与运算符 #{logical_and_operator} *逻辑与运算符*(`a && b`)表达了只有 `a` 和 `b` 的值都为 `true` 时,整个表达式的值才会是 `true`。 @@ -421,7 +421,7 @@ if enteredDoorCode && passedRetinaScan { // 输出“ACCESS DENIED” ``` -### 逻辑或运算符 +### 逻辑或运算符 #{logical_or_operator} 逻辑或运算符(`a || b`)是一个由两个连续的 `|` 组成的中置运算符。它表示了两个逻辑表达式的其中一个为 `true`,整个表达式就为 `true`。 @@ -440,7 +440,7 @@ if hasDoorKey || knowsOverridePassword { // 输出“Welcome!” ``` -### 逻辑运算符组合计算 +### 逻辑运算符组合计算 {#combining_logical_operators} 我们可以组合多个逻辑运算符来表达一个复合逻辑: @@ -463,7 +463,7 @@ if enteredDoorCode && passedRetinaScan || hasDoorKey || knowsOverridePassword { > > Swift 逻辑操作符 `&&` 和 `||` 是左结合的,这意味着拥有多元逻辑操作符的复合表达式优先计算最左边的子表达式。 -### 使用括号来明确优先级 +### 使用括号来明确优先级 {#explicit_parentheses} 为了一个复杂表达式更容易读懂,在合适的地方使用括号来明确优先级是很有效的,虽然它并非必要的。在上个关于门的权限的例子中,我们给第一个部分加个括号,使它看起来逻辑更明确: diff --git a/source/chapter2/08_Enumerations.md b/source/chapter2/08_Enumerations.md index ed9ae60d..ab9a04fb 100755 --- a/source/chapter2/08_Enumerations.md +++ b/source/chapter2/08_Enumerations.md @@ -99,7 +99,7 @@ default: // 打印“Mostly harmless” ``` -## 枚举成员的遍历 {#iterating over enumeration cases} +## 枚举成员的遍历 {#iterating_over_enumeration_cases} 在一些情况下,你会需要得到一个包含枚举所有成员的集合。可以通过如下代码实现: diff --git a/source/chapter2/13_Inheritance.md b/source/chapter2/13_Inheritance.md index ecc78cfc..2d548bc3 100755 --- a/source/chapter2/13_Inheritance.md +++ b/source/chapter2/13_Inheritance.md @@ -113,7 +113,7 @@ print("Tandem: \(tandem.description)") `override` 关键字会提醒 Swift 编译器去检查该类的超类(或其中一个父类)是否有匹配重写版本的声明。这个检查可以确保你的重写定义是正确的。 -### 访问超类的方法,属性及下标 +### 访问超类的方法,属性及下标 {#accessing_superclass_methods_properties_and_subscripts} 当你在子类中重写超类的方法,属性或下标时,有时在你的重写版本中使用已经存在的超类实现会大有裨益。比如,你可以完善已有实现的行为,或在一个继承来的变量中存储一个修改过的值。 @@ -123,7 +123,7 @@ print("Tandem: \(tandem.description)") * 在属性 `someProperty` 的 getter 或 setter 的重写实现中,可以通过 `super.someProperty` 来访问超类版本的 `someProperty` 属性。 * 在下标的重写实现中,可以通过 `super[someIndex]` 来访问超类版本中的相同下标。 -### 重写方法 +### 重写方法 {#overriding_methods} 在子类中,你可以重写继承来的实例方法或类方法,提供一个定制或替代的方法实现。 @@ -145,11 +145,11 @@ train.makeNoise() // 打印“Choo Choo” ``` -### 重写属性 +### 重写属性 {#overriding_properties} 你可以重写继承来的实例属性或类型属性,提供自己定制的 getter 和 setter,或添加属性观察器,使重写的属性可以观察到底层的属性值什么时候发生改变。 -#### 重写属性的 Getters 和 Setters +#### 重写属性的 Getters 和 Setters {#overriding_property_etters_and_setters} 你可以提供定制的 getter(或 setter)来重写任何一个继承来的属性,无论这个属性是存储型还是计算型属性。子类并不知道继承来的属性是存储型的还是计算型的,它只知道继承来的属性会有一个名字和类型。你在重写一个属性时,必须将它的名字和类型都写出来。这样才能使编译器去检查你重写的属性是与超类中同名同类型的属性相匹配的。 diff --git a/source/chapter2/17_Error_Handling.md b/source/chapter2/17_Error_Handling.md index c4023892..51f11691 100755 --- a/source/chapter2/17_Error_Handling.md +++ b/source/chapter2/17_Error_Handling.md @@ -128,7 +128,7 @@ struct PurchasedSnack { } ``` -### 用 Do-Catch 处理错误 +### 用 Do-Catch 处理错误 {#handling_errors_using_do-Catch} 你可以使用一个 `do-catch` 语句运行一段闭包代码来处理错误。如果在 `do` 子句中的代码抛出了一个错误,这个错误会与 `catch` 子句做匹配,从而决定哪条子句能处理它。 @@ -194,7 +194,7 @@ do { 如果 `vend(itemNamed:)` 抛出的是一个 `VendingMachineError` 类型的错误,`nourish(with:)` 会打印一条消息,否则 `nourish(with:)` 会将错误抛给它的调用方。这个错误之后会被通用的 `catch` 语句捕获。 -### 将错误转换成可选值 +### 将错误转换成可选值 #{converting_errors_to_optional_values} 可以使用 `try?` 通过将错误转换成一个可选值来处理错误。如果是在计算 `try?` 表达式时抛出错误,该表达式的结果就为 `nil`。例如,在下面的代码中,`x` 和 `y` 有着相同的数值和等价的含义: @@ -225,7 +225,7 @@ func fetchData() -> Data? { } ``` -### 禁用错误传递 +### 禁用错误传递 #{disabling_error_propagation} 有时你知道某个 `throwing` 函数实际上在运行时是不会抛出错误的,在这种情况下,你可以在表达式前面写 `try!` 来禁用错误传递,这会把调用包装在一个不会有错误抛出的运行时断言中。如果真的抛出了错误,你会得到一个运行时错误。 diff --git a/source/chapter2/20_Extensions.md b/source/chapter2/20_Extensions.md index 0429ec9c..533d9ab2 100644 --- a/source/chapter2/20_Extensions.md +++ b/source/chapter2/20_Extensions.md @@ -17,7 +17,7 @@ Swift 中的扩展可以: > > 扩展可以给一个类型添加新的功能,但是不能重写已经存在的功能。 -## 扩展的语法 +## 扩展的语法 {#extension_syntax} 使用 `extension` 关键字声明扩展: @@ -43,7 +43,7 @@ extension SomeType: SomeProtocol, AnotherProtocol { > > 对一个现有的类型,如果你定义了一个扩展来添加新的功能,那么这个类型的所有实例都可以使用这个新功能,包括那些在扩展定义之前就存在的实例。 -## 计算型属性 +## 计算型属性 {#computed_properties} 扩展可以给现有类型添加计算型实例属性和计算型类属性。这个例子给 Swift 内建的 `Double` 类型添加了五个计算型实例属性,从而提供与距离单位相关工作的基本支持: @@ -81,7 +81,7 @@ print("A marathon is \(aMarathon) meters long") > > 扩展可以添加新的计算属性,但是它们不能添加存储属性,或向现有的属性添加属性观察者。 -## 构造器 +## 构造器 {#initializers} 扩展可以给现有的类型添加新的构造器。它使你可以把自定义类型作为参数来供其他类型的构造器使用,或者在类型的原始实现上添加额外的构造选项。 @@ -138,7 +138,7 @@ let centerRect = Rect(center: Point(x: 4.0, y: 4.0), > > 如果你通过扩展提供一个新的构造器,你有责任确保每个通过该构造器创建的实例都是初始化完整的。 -## 方法 +## 方法 {#methods} 扩展可以给现有类型添加新的实例方法和类方法。在下面的例子中,给 `Int` 类型添加了一个新的实例方法叫做 `repetitions`: @@ -165,7 +165,7 @@ extension Int { // Hello! ``` -### 可变实例方法 +### 可变实例方法 {#mutating_instance_methods} 通过扩展添加的实例方法同样也可以修改(或 *mutating(改变)*)实例本身。结构体和枚举的方法,若是可以修改 `self` 或者它自己的属性,则必须将这个实例方法标记为 `mutating`,就像是改变了方法的原始实现。 @@ -182,7 +182,7 @@ someInt.square() // someInt 现在是 9 ``` -## 下标 +## 下标 {#subscripts} 扩展可以给现有的类型添加新的下标。下面的例子中,对 Swift 的 `Int` 类型添加了一个整数类型的下标。下标 `[n]` 从数字右侧开始,返回小数点后的第 `n` 位: @@ -218,7 +218,7 @@ extension Int { 0746381295[9] ``` -## 嵌套类型 +## 嵌套类型 {#nested_yypes} 扩展可以给现有的类,结构体,还有枚举添加新的嵌套类型: diff --git a/source/chapter2/21_Protocols.md b/source/chapter2/21_Protocols.md index c137d6b6..8a287108 100644 --- a/source/chapter2/21_Protocols.md +++ b/source/chapter2/21_Protocols.md @@ -192,7 +192,7 @@ protocol SomeProtocol { } ``` -### 协议构造器要求的类实现 +### 协议构造器要求的类实现 {#class_implementations_of_protocol_initializer_requirements} 你可以在遵循协议的类中实现构造器,无论是作为指定构造器,还是作为便利构造器。无论哪种情况,你都必须为构造器实现标上 `required` 修饰符: @@ -234,7 +234,7 @@ class SomeSubClass: SomeSuperClass, SomeProtocol { } ``` -### 可失败构造器要求 +### 可失败构造器要求 {#failable_initializer_requirements} 协议还可以为遵循协议的类型定义可失败构造器要求,详见 [可失败构造器](./14_Initialization.md#failable_initializers)。