From 067bc9634d9b14d76d40d30f6e2adc50c07acdfa Mon Sep 17 00:00:00 2001 From: BqLin Date: Mon, 19 Feb 2018 22:48:55 +0800 Subject: [PATCH] =?UTF-8?q?=E4=B8=AD=E6=96=87=E9=80=97=E5=8F=B7=E3=80=81?= =?UTF-8?q?=E5=8F=A5=E5=8F=B7=E4=BD=BF=E7=94=A8=E4=BF=AE=E6=AD=A3=20(#773)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * 修正全角逗号、句号的使用 * 修正逗号使用 * 修正一处代码空格错误 * 修正斜体范围,引用的空格使用 * 修正示例代码错误 --- source/chapter1/03_a_swift_tour.md | 2 +- source/chapter1/04_revision_history.md | 32 +++++++++---------- source/chapter2/01_The_Basics.md | 6 ++-- source/chapter2/02_Basic_Operators.md | 2 +- source/chapter2/03_Strings_and_Characters.md | 8 ++--- source/chapter2/04_Collection_Types.md | 4 +-- source/chapter2/06_Functions.md | 2 +- source/chapter2/08_Enumerations.md | 2 +- source/chapter2/09_Classes_and_Structures.md | 2 +- source/chapter2/10_Properties.md | 10 +++--- source/chapter2/11_Methods.md | 4 +-- source/chapter2/14_Initialization.md | 4 +-- source/chapter2/15_Deinitialization.md | 2 +- source/chapter2/17_Optional_Chaining.md | 2 +- source/chapter2/23_Generics.md | 2 +- source/chapter3/04_Expressions.md | 6 ++-- source/chapter3/05_Declarations.md | 28 ++++++++-------- source/chapter3/06_Attributes.md | 6 ++-- .../08_Generic_Parameters_and_Arguments.md | 4 +-- source/chapter3/09_Summary_of_the_Grammar.md | 4 +-- source/chapter3/10_Statements.md | 2 +- 21 files changed, 67 insertions(+), 67 deletions(-) diff --git a/source/chapter1/03_a_swift_tour.md b/source/chapter1/03_a_swift_tour.md index 11f5c880..b4b7be08 100755 --- a/source/chapter1/03_a_swift_tour.md +++ b/source/chapter1/03_a_swift_tour.md @@ -92,7 +92,7 @@ let fruitSummary = "I have \(apples + oranges) pieces of fruit." > 练习: > 使用 `\()` 来把一个浮点计算转换成字符串,并加上某人的名字,和他打个招呼。 -使用一对三个单引号(`"""`)来包含多行字符串内容,字符串中的内容(包括引号、空格、换行符等)都会保留下来。举个例子: +使用一对三个单引号(`"""`)来包含多行字符串内容,字符串中的内容(包括引号、空格、换行符等)都会保留下来。举个例子: ```swift let quotation = """ diff --git a/source/chapter1/04_revision_history.md b/source/chapter1/04_revision_history.md index b833083b..9a5036ba 100644 --- a/source/chapter1/04_revision_history.md +++ b/source/chapter1/04_revision_history.md @@ -608,13 +608,13 @@ 在声明特性(Declaration Attributes)章节增加了关于availability特性的一些信息
  • - 可选类型(Optionals) 若有值时,不再隐式的转换为 true,同样,若无值时,也不再隐式的转换为 false, 这是为了避免在判别 optional Bool 的值时产生困惑。 替代的方案是,用==!= 运算符显式地去判断Optinal是否是 nil,以确认其是否包含值。 + 可选类型(Optionals) 若有值时,不再隐式的转换为 true,同样,若无值时,也不再隐式的转换为 false,这是为了避免在判别 optional Bool 的值时产生困惑。 替代的方案是,用==!= 运算符显式地去判断Optinal是否是 nil,以确认其是否包含值。
  • Swift新增了一个 Nil合并运算符(Nil Coalescing Operator) (a ?? b), 该表达式中,如果Optional a的值存在,则取得它并返回,若Optional anil,则返回默认值 b
  • - 更新和扩展 字符串的比较(Comparing Strings) 章节,用以反映和展示'字符串和字符的比较',以及'前缀(prefix)/后缀(postfix)比较'都开始基于扩展字符集(extended grapheme clusters)规范的等价比较. + 更新和扩展 字符串的比较(Comparing Strings) 章节,用以反映和展示'字符串和字符的比较',以及'前缀(prefix)/后缀(postfix)比较'都开始基于扩展字符集(extended grapheme clusters)规范的等价比较。
  • 现在,你可以通过 可选链(Optional Chaining)来:给属性设值,将其赋给一个下标脚注(subscript); 或调用一个变异(mutating)方法或运算符。对此,章节——通过可选链访问属性(Accessing Properties Through Optional Chaining)的内容已经被相应的更新。而章节——通过可选链调用方法(Calling Methods Through Optional Chaining中,关于检查方法调用是否成功的例子,已被扩展为展示如何检查一个属性是否被设值成功。 @@ -624,30 +624,30 @@ 在章节可选链中,增加一个新的小节 访问可选类型的下标脚注(Accessing Subscripts of Optional Type)
  • - 更新章节 访问和修改数组(Accessing and Modifying an Array) 以标示:从该版本起,不能再通过+= 运算符给一个数组添加一个新的项。. 对应的替代方案是, 使append 方法, 或者通过+=运算符来添加一个只有一个项的数组(single-item Array).
  • + 更新章节 访问和修改数组(Accessing and Modifying an Array) 以标示:从该版本起,不能再通过+= 运算符给一个数组添加一个新的项。。 对应的替代方案是,使append 方法,或者通过+=运算符来添加一个只有一个项的数组(single-item Array)。
  • 添加了一个提示:在 范围运算符(Range Operators)中,比如, a...ba..<b ,起始值a不能大于结束值b.
  • - 重写了继承(Inheritance) 这一章:删除了本章中关于构造器重写的介绍性报道;转而将更多的注意力放到新增的部分——子类的新功能,以及如何通过重写(overrides)修改已有的功能。另外,小节 重写属性的Getters和Setters(Overriding Property Getters and Setters) 中的例子已经被替换为展示如何重写一个 description 属性. (而关于如何在子类的构造器中修改继承属性的默认值的例子,已经被移到 构造过程(Initialization) 这一章.) + 重写了继承(Inheritance) 这一章:删除了本章中关于构造器重写的介绍性报道;转而将更多的注意力放到新增的部分——子类的新功能,以及如何通过重写(overrides)修改已有的功能。另外,小节 重写属性的Getters和Setters(Overriding Property Getters and Setters) 中的例子已经被替换为展示如何重写一个 description 属性。 (而关于如何在子类的构造器中修改继承属性的默认值的例子,已经被移到 构造过程(Initialization) 这一章。)
  • - 更新了 构造器的继承与重写(Initializer Inheritance and Overriding) 小节以标示: 重写一个特定的构造器必须使用 override 修饰符. + 更新了 构造器的继承与重写(Initializer Inheritance and Overriding) 小节以标示: 重写一个特定的构造器必须使用 override 修饰符。
  • - 更新 Required构造器(Required Initializers) 小节以标示:required 修饰符现在需要出现在所有子类的required构造器的声明中, 而required构造器的实现,现在可以仅从父类自动继承。 + 更新 Required构造器(Required Initializers) 小节以标示:required 修饰符现在需要出现在所有子类的required构造器的声明中,而required构造器的实现,现在可以仅从父类自动继承。
  • - 中置(Infix)的 运算符函数(Operator Functions) 不再需要@infix 属性. + 中置(Infix)的 运算符函数(Operator Functions) 不再需要@infix 属性。
  • - 前置和后置运算符(Prefix and Postfix Operators)@prefix@postfix 属性,已变更为 prefixpostfix 声明修饰符(declaration modifiers). + 前置和后置运算符(Prefix and Postfix Operators)@prefix@postfix 属性,已变更为 prefixpostfix 声明修饰符(declaration modifiers)。
  • 增加一条注解:当Prefix和postfix运算符被作用于同一个操作数时,关于前置和后置运算符(Prefix and Postfix Operators)的顺序(postfix运算符会先被执行)
  • - 在运算符函数(Operator functions)中, 组合赋值运算符(Compound Assignment Operators) 不再使用 @assignment 属性来定义函数. + 在运算符函数(Operator functions)中, 组合赋值运算符(Compound Assignment Operators) 不再使用 @assignment 属性来定义函数。
  • 在这个版本中,在定义自定义操作符(Custom Operators) 时,修饰符(Modifiers)的出现顺序发生变化。比如, 现在,你该编写 prefix operator, 而不是 operator prefix. @@ -659,22 +659,22 @@ 增加信息:字面量Literals 的类型推导(type inference)
  • - 为章节Curried Functions添加了更多的信息. + 为章节Curried Functions添加了更多的信息。
  • 加入新的章节 权限控制(Access Control).
  • - 更新了章节 字符串和字符(Strings and Characters) 用以表明,在Swift中,Character 类型现在代表的是扩展字符集(extended grapheme cluster)中的一个Unicode,为此,新增了小节 Extended Grapheme Clusters 。同时,为小节 Unicode标量(Unicode Scalars)字符串比较(Comparing Strings)增加了更多内容. + 更新了章节 字符串和字符(Strings and Characters) 用以表明,在Swift中,Character 类型现在代表的是扩展字符集(extended grapheme cluster)中的一个Unicode,为此,新增了小节 Extended Grapheme Clusters 。同时,为小节 Unicode标量(Unicode Scalars)字符串比较(Comparing Strings)增加了更多内容。
  • - 更新章节字符串字面量(String Literals):在一个字符串中,Unicode标量(Unicode scalars) 以 \u{n}的形式来表示, n 是一个最大可以有8位的16进制数(hexadecimal digits) + 更新章节字符串字面量(String Literals):在一个字符串中,Unicode标量(Unicode scalars) 以 \u{n}的形式来表示,n 是一个最大可以有8位的16进制数(hexadecimal digits)
  • - NSString length 属性已被映射到Swift的内建 String类型。(注意,这两属性的类型是utf16Count,而非 utf16count). + NSString length 属性已被映射到Swift的内建 String类型。(注意,这两属性的类型是utf16Count,而非 utf16count)。
  • - Swift的内建 String 类型不再拥有 uppercaseStringlowercaseString 属性.其对应部分在章节 字符串和字符(Strings and Characters)已经被删除, 并且各种对应的代码用例也已被更新. + Swift的内建 String 类型不再拥有 uppercaseStringlowercaseString 属性。其对应部分在章节 字符串和字符(Strings and Characters)已经被删除,并且各种对应的代码用例也已被更新。
  • 加入新的章节 没有外部名的构造器参数(Initializer Parameters Without External Names). @@ -704,7 +704,7 @@ nil 和布尔运算中的 truefalse 现在被定义为字面量Literals.
  • - Swift 中的数组 (Array) 类型从现在起具备了完整的值语义。具体信息被更新到 集合的可变性(Mutability of Collections)数组(Arrays) 两小节,以反映这个新的变化. 此外,还解释了如何 给Strings, Arrays和Dictionaries进行赋值和拷贝 (Assignment and Copy Behavior for Strings, Arrays, and Dictionaries). + Swift 中的数组 (Array) 类型从现在起具备了完整的值语义。具体信息被更新到 集合的可变性(Mutability of Collections)数组(Arrays) 两小节,以反映这个新的变化。 此外,还解释了如何 给Strings, Arrays和Dictionaries进行赋值和拷贝 (Assignment and Copy Behavior for Strings, Arrays, and Dictionaries).
  • 数组类型速记语法(Array Type Shorthand Syntax)SomeType[].更新为[SomeType] @@ -716,7 +716,7 @@ 加入新的小节:字典键类型的哈希值(Hash Values for Dictionary Key Types).
  • - 例子 闭包表达式 (Closure Expressions) 中使用新的全局函数 sorted 取代原先的全局函数 sort 去展示如何返回一个全新的数组. + 例子 闭包表达式 (Closure Expressions) 中使用新的全局函数 sorted 取代原先的全局函数 sort 去展示如何返回一个全新的数组。
  • 更新关于 结构体逐一成员构造器 (Memberwise Initializers for Structure Types) 的描述:即使结构体的成员没有默认值,逐一成员构造器也可以自动获得。 diff --git a/source/chapter2/01_The_Basics.md b/source/chapter2/01_The_Basics.md index cbe6d64c..b3d9a396 100755 --- a/source/chapter2/01_The_Basics.md +++ b/source/chapter2/01_The_Basics.md @@ -197,7 +197,7 @@ Swift 中的注释与 C 语言的注释非常相似。单行注释以双正斜 你也可以进行多行注释,其起始标记为单个正斜杠后跟随一个星号(`/*`),终止标记为一个星号后跟随单个正斜杠(`*/`): ```swift -/* 这是一个, +/* 这是一个, 多行注释 */ ``` @@ -742,7 +742,7 @@ func canThrowAnError() throws { } ``` -一个函数可以通过在声明中添加`throws`关键词来抛出错误消息。当你的函数能抛出错误消息时, 你应该在表达式中前置`try`关键词。 +一个函数可以通过在声明中添加`throws`关键词来抛出错误消息。当你的函数能抛出错误消息时,你应该在表达式中前置`try`关键词。 ```swift do { @@ -753,7 +753,7 @@ do { } ``` -一个`do`语句创建了一个新的包含作用域,使得错误能被传播到一个或多个`catch`从句。 +一个`do`语句创建了一个新的包含作用域,使得错误能被传播到一个或多个`catch`从句。 这里有一个错误处理如何用来应对不同错误条件的例子。 diff --git a/source/chapter2/02_Basic_Operators.md b/source/chapter2/02_Basic_Operators.md index 7b8e436a..bcddd874 100755 --- a/source/chapter2/02_Basic_Operators.md +++ b/source/chapter2/02_Basic_Operators.md @@ -72,7 +72,7 @@ let (x, y) = (1, 2) ```swift if x = y { - // 此句错误, 因为 x = y 并不返回任何值 + // 此句错误,因为 x = y 并不返回任何值 } ``` diff --git a/source/chapter2/03_Strings_and_Characters.md b/source/chapter2/03_Strings_and_Characters.md index 89523221..7b54f789 100755 --- a/source/chapter2/03_Strings_and_Characters.md +++ b/source/chapter2/03_Strings_and_Characters.md @@ -133,9 +133,9 @@ It also ends with a line break. ```swift let wiseWords = "\"Imagination is more important than knowledge\" - Einstein" // "Imageination is more important than knowledge" - Enistein -let dollarSign = "\u{24}" // $, Unicode 标量 U+0024 -let blackHeart = "\u{2665}" // ♥, Unicode 标量 U+2665 -let sparklingHeart = "\u{1F496}" // 💖, Unicode 标量 U+1F496 +let dollarSign = "\u{24}" // $,Unicode 标量 U+0024 +let blackHeart = "\u{2665}" // ♥,Unicode 标量 U+2665 +let sparklingHeart = "\u{1F496}" // 💖,Unicode 标量 U+1F496 ``` 由于多行字符串字面量使用了三个双引号,而不是一个,所以你可以在多行字符串字面量里直接使用双引号(`"`)而不必加上转义符(`\`)。要在多行字符串字面量中使用 `"""` 的话,就需要使用至少一个转义符(`\`): @@ -394,7 +394,7 @@ var word = "cafe" print("the number of characters in \(word) is \(word.count)") // 打印输出 "the number of characters in cafe is 4" -word += "\u{301}" // 拼接一个重音, U+0301 +word += "\u{301}" // 拼接一个重音,U+0301 print("the number of characters in \(word) is \(word.count)") // 打印输出 "the number of characters in café is 4" diff --git a/source/chapter2/04_Collection_Types.md b/source/chapter2/04_Collection_Types.md index fefe69fd..4fb0132c 100755 --- a/source/chapter2/04_Collection_Types.md +++ b/source/chapter2/04_Collection_Types.md @@ -413,7 +413,7 @@ for genre in favoriteGenres { 更多关于`for-in`循环的信息,参见[For 循环](./05_Control_Flow.html#for_loops)。 -Swift 的`Set`类型没有确定的顺序,为了按照特定顺序来遍历一个`Set`中的值可以使用`sorted()`方法,它将返回一个有序数组,这个数组的元素排列顺序由操作符'<'对元素进行比较的结果来确定. +Swift 的`Set`类型没有确定的顺序,为了按照特定顺序来遍历一个`Set`中的值可以使用`sorted()`方法,它将返回一个有序数组,这个数组的元素排列顺序由操作符'<'对元素进行比较的结果来确定。 ```swift for genre in favoriteGenres.sorted() { @@ -622,7 +622,7 @@ if let airportName = airports["DUB"] { ```swift airports["APL"] = "Apple Internation" -// "Apple Internation" 不是真的 APL 机场, 删除它 +// "Apple Internation" 不是真的 APL 机场,删除它 airports["APL"] = nil // APL 现在被移除了 ``` diff --git a/source/chapter2/06_Functions.md b/source/chapter2/06_Functions.md index 623740d2..0312f91d 100755 --- a/source/chapter2/06_Functions.md +++ b/source/chapter2/06_Functions.md @@ -204,7 +204,7 @@ print("min is \(bounds.min) and max is \(bounds.max)") 如果函数返回的元组类型有可能整个元组都“没有值”,你可以使用可选的( `optional` ) 元组返回类型反映整个元组可以是`nil`的事实。你可以通过在元组类型的右括号后放置一个问号来定义一个可选元组,例如 `(Int, Int)?` 或 `(String, Int, Bool)?` >注意 -可选元组类型如 `(Int, Int)?` 与元组包含可选类型如 `(Int?, Int?)` 是不同的.可选的元组类型,整个元组是可选的,而不只是元组中的每个元素值。 +可选元组类型如 `(Int, Int)?` 与元组包含可选类型如 `(Int?, Int?)` 是不同的。可选的元组类型,整个元组是可选的,而不只是元组中的每个元素值。 前面的 `minMax(array:)` 函数返回了一个包含两个 `Int` 值的元组。但是函数不会对传入的数组执行任何安全检查,如果 `array` 参数是一个空数组,如上定义的 `minMax(array:)` 在试图访问 `array[0]` 时会触发一个运行时错误(runtime error)。 diff --git a/source/chapter2/08_Enumerations.md b/source/chapter2/08_Enumerations.md index d1a4dca3..2b07294e 100755 --- a/source/chapter2/08_Enumerations.md +++ b/source/chapter2/08_Enumerations.md @@ -32,7 +32,7 @@ *枚举*为一组相关的值定义了一个共同的类型,使你可以在你的代码中以类型安全的方式来使用这些值。 -如果你熟悉 C 语言,你会知道在 C 语言中,枚举会为一组整型值分配相关联的名称。Swift 中的枚举更加灵活,不必给每一个枚举成员提供一个值。如果给枚举成员提供一个值(称为“原始”值),则该值的类型可以是字符串,字符,或是一个整型值或浮点数。 +如果你熟悉 C 语言,你会知道在 C 语言中,枚举会为一组整型值分配相关联的名称。Swift 中的枚举更加灵活,不必给每一个枚举成员提供一个值。如果给枚举成员提供一个值(称为“原始”值),则该值的类型可以是字符串、字符,或是一个整型值或浮点数。 此外,枚举成员可以指定*任意*类型的关联值存储到枚举成员中,就像其他语言中的联合体(unions)和变体(variants)。你可以在一个枚举中定义一组相关的枚举成员,每一个枚举成员都可以有适当类型的关联值。 diff --git a/source/chapter2/09_Classes_and_Structures.md b/source/chapter2/09_Classes_and_Structures.md index 4a43a14a..8608dfc7 100755 --- a/source/chapter2/09_Classes_and_Structures.md +++ b/source/chapter2/09_Classes_and_Structures.md @@ -145,7 +145,7 @@ print("The width of someVideoMode is now \(someVideoMode.resolution.width)") 所有结构体都有一个自动生成的*成员逐一构造器*,用于初始化新结构体实例中成员的属性。新实例中各个属性的初始值可以通过属性的名称传递到成员逐一构造器之中: ```swift -let vga = Resolution(width:640, height: 480) +let vga = Resolution(width: 640, height: 480) ``` 与结构体不同,类实例没有默认的成员逐一构造器。[构造过程](./14_Initialization.html)章节会对构造器进行更详细的讨论。 diff --git a/source/chapter2/10_Properties.md b/source/chapter2/10_Properties.md index d0d89fe2..25c9f8f6 100755 --- a/source/chapter2/10_Properties.md +++ b/source/chapter2/10_Properties.md @@ -41,7 +41,7 @@ 可以在定义存储属性的时候指定默认值,请参考[默认构造器](./14_Initialization.html#default_initializers)一节。也可以在构造过程中设置或修改存储属性的值,甚至修改常量存储属性的值,请参考[构造过程中常量属性的修改](./14_Initialization.html#assigning_constant_properties_during_initialization)一节。 -下面的例子定义了一个名为 `FixedLengthRange` 的结构体,该结构体用于描述整数的范围,且这个范围值在被创建后不能被修改. +下面的例子定义了一个名为 `FixedLengthRange` 的结构体,该结构体用于描述整数的范围,且这个范围值在被创建后不能被修改。 ```swift struct FixedLengthRange { @@ -77,7 +77,7 @@ rangeOfFourItems.firstValue = 6 ### 延迟存储属性 -*延迟存储属*性是指当第一次被调用的时候才会计算其初始值的属性。在属性声明前使用 `lazy` 来标示一个延迟存储属性。 +*延迟存储属性*是指当第一次被调用的时候才会计算其初始值的属性。在属性声明前使用 `lazy` 来标示一个延迟存储属性。 > 注意 > 必须将延迟存储属性声明成变量(使用 `var` 关键字),因为属性的初始值可能在实例构造完成之后才会得到。而常量属性在构造过程完成之前必须要有初始值,因此无法声明成延迟属性。 @@ -285,9 +285,9 @@ stepCounter.totalSteps = 896 `didSet` 观察器在 `totalSteps` 的值改变后被调用,它把新值和旧值进行对比,如果总步数增加了,就输出一个消息表示增加了多少步。`didSet` 没有为旧值提供自定义名称,所以默认值 `oldValue` 表示旧值的参数名。 ->注意 -> ->如果将属性通过 in-out 方式传入函数,`willSet` 和 `didSet` 也会调用。这是因为 in-out 参数采用了拷入拷出模式:即在函数内部使用的是参数的 copy,函数结束后,又对参数重新赋值。关于 in-out 参数详细的介绍,请参考[输入输出参数](../chapter3/05_Declarations.html#in-out_parameters) +> 注意 +> +> 如果将属性通过 in-out 方式传入函数,`willSet` 和 `didSet` 也会调用。这是因为 in-out 参数采用了拷入拷出模式:即在函数内部使用的是参数的 copy,函数结束后,又对参数重新赋值。关于 in-out 参数详细的介绍,请参考[输入输出参数](../chapter3/05_Declarations.html#in-out_parameters) ## 全局变量和局部变量 diff --git a/source/chapter2/11_Methods.md b/source/chapter2/11_Methods.md index ff7d8c38..d2a19ca7 100755 --- a/source/chapter2/11_Methods.md +++ b/source/chapter2/11_Methods.md @@ -95,7 +95,7 @@ func increment() { ```swift struct Point { var x = 0.0, y = 0.0 - func isToTheRightOfX(x: Double) -> Bool { + func isToTheRightOfX(_ x: Double) -> Bool { return self.x > x } } @@ -120,7 +120,7 @@ if somePoint.isToTheRightOfX(1.0) { ```swift struct Point { var x = 0.0, y = 0.0 - mutating func moveByX(deltaX: Double, y deltaY: Double) { + mutating func moveByX(_ deltaX: Double, y deltaY: Double) { x += deltaX y += deltaY } diff --git a/source/chapter2/14_Initialization.md b/source/chapter2/14_Initialization.md index 9defb1c8..087bdf18 100755 --- a/source/chapter2/14_Initialization.md +++ b/source/chapter2/14_Initialization.md @@ -291,7 +291,7 @@ let twoByTwo = Size(width: 2.0, height: 2.0) 对于值类型,你可以使用 `self.init` 在自定义的构造器中引用相同类型中的其它构造器。并且你只能在构造器内部调用 `self.init`。 -请注意,如果你为某个值类型定义了一个自定义的构造器,你将无法访问到默认构造器(如果是结构体,还将无法访问逐一成员构造器)。这种限制可以防止你为值类型增加了一个额外的且十分复杂的构造器之后,仍然有人错误的使用自动生成的构造器 +请注意,如果你为某个值类型定义了一个自定义的构造器,你将无法访问到默认构造器(如果是结构体,还将无法访问逐一成员构造器)。这种限制可以防止你为值类型增加了一个额外的且十分复杂的构造器之后,仍然有人错误的使用自动生成的构造器 > 注意 假如你希望默认构造器、逐一成员构造器以及你自己的自定义构造器都能用来创建实例,可以将自定义的构造器写到扩展(`extension`)中,而不是写在值类型的原始定义中。想查看更多内容,请查看[扩展](./21_Extensions.html)章节。 @@ -736,7 +736,7 @@ if let valueMaintained = Int(exactly: wholeNumber) { // 打印 "12345.0 conversion to Int maintains value of 12345" let valueChanged = Int(exactly: pi) -// valueChanged 是 Int? 类型, 不是 Int 类型 +// valueChanged 是 Int? 类型,不是 Int 类型 if valueChanged == nil { print("\(pi) conversion to Int does not maintain value") diff --git a/source/chapter2/15_Deinitialization.md b/source/chapter2/15_Deinitialization.md index 2e2be85f..a79a34f6 100755 --- a/source/chapter2/15_Deinitialization.md +++ b/source/chapter2/15_Deinitialization.md @@ -84,7 +84,7 @@ class Player { } ``` -每个`Player`实例在初始化的过程中,都从`Bank`对象获取指定数量的硬币。如果没有足够的硬币可用,`Player`实例可能会收到比指定数量少的硬币. +每个`Player`实例在初始化的过程中,都从`Bank`对象获取指定数量的硬币。如果没有足够的硬币可用,`Player`实例可能会收到比指定数量少的硬币。 `Player`类定义了一个`win(coins:)`方法,该方法从`Bank`对象获取一定数量的硬币,并把它们添加到玩家的钱包。`Player`类还实现了一个析构器,这个析构器在`Player`实例释放前被调用。在这里,析构器的作用只是将玩家的所有硬币都返还给`Bank`对象: diff --git a/source/chapter2/17_Optional_Chaining.md b/source/chapter2/17_Optional_Chaining.md index 62a288c5..d244555b 100755 --- a/source/chapter2/17_Optional_Chaining.md +++ b/source/chapter2/17_Optional_Chaining.md @@ -59,7 +59,7 @@ class Residence { `Residence`有一个`Int`类型的属性`numberOfRooms`,其默认值为`1`。`Person`具有一个可选的`residence`属性,其类型为`Residence?`。 -假如你创建了一个新的`Person`实例,它的`residence`属性由于是是可选型而将初始化为`nil`,在下面的代码中,`john`有一个值为`nil`的`residence`属性: +假如你创建了一个新的`Person`实例,它的`residence`属性由于是是可选型而将初始化为`nil`,在下面的代码中,`john`有一个值为`nil`的`residence`属性: ```swift let john = Person() diff --git a/source/chapter2/23_Generics.md b/source/chapter2/23_Generics.md index 8ab6708f..085acd8d 100644 --- a/source/chapter2/23_Generics.md +++ b/source/chapter2/23_Generics.md @@ -692,5 +692,5 @@ extension Container { - 下标使用的单一的参数,`indices`,必须是 `Indices` 的实例。 - 泛型 `where` 子句要求 Sequence(Indices)的迭代器,其所有的元素都是 `Int` 类型。这样就能确保在序列(Sequence)中的索引和容器(Container)里面的索引类型是一致的。 -综合一下,这些约束意味着,传入到 `indices` 下标,是一个整型的序列. +综合一下,这些约束意味着,传入到 `indices` 下标,是一个整型的序列。 (译者:原来的 `Container` 协议,`subscript` 必须是 `Int` 型的,扩展中新的 `subscript`,允许下标是一个的序列,而非单一的值。) diff --git a/source/chapter3/04_Expressions.md b/source/chapter3/04_Expressions.md index 912b0eff..9b82bfd2 100644 --- a/source/chapter3/04_Expressions.md +++ b/source/chapter3/04_Expressions.md @@ -554,9 +554,9 @@ class SomeClass: NSObject { let selectorForMethod = #selector(SomeClass.doSomething(_:)) let selectorForPropertyGetter = #selector(getter: SomeClass.property) ``` -当为属性的getter创建选择器时,属性名可以是变量属性或者常量属性的引用。但是当为属性的setter创建选择器时,属性名只可以是对变量属性的引用。 +当为属性的getter创建选择器时,属性名可以是变量属性或者常量属性的引用。但是当为属性的setter创建选择器时,属性名只可以是对变量属性的引用。 -方法名称可以包含圆括号来进行分组,并使用as 操作符来区分具有相同方法名但类型不同的方法, 例如: +方法名称可以包含圆括号来进行分组,并使用as 操作符来区分具有相同方法名但类型不同的方法,例如: ```swift extension SomeClass { @@ -765,7 +765,7 @@ let x = [10, 3, 20, 15, 4] ### dynamicType 表达式 -dynamicType 表达式由类似[函数调用表达式(Function Call Expression)](#function-call-expression)的特殊语法表达式组成,形式如下: +dynamicType 表达式由类似[函数调用表达式(Function Call Expression)](#function-call-expression)的特殊语法表达式组成,形式如下: > type(of:`表达式`) diff --git a/source/chapter3/05_Declarations.md b/source/chapter3/05_Declarations.md index 7671d010..a8ef8ddf 100755 --- a/source/chapter3/05_Declarations.md +++ b/source/chapter3/05_Declarations.md @@ -337,12 +337,12 @@ typealias StringDictionary = Dictionary var dictionary1: StringDictionary = [:] var dictionary2: Dictionary = [:] ``` -当一个类型别名带着泛型参数一起被声明时,这些参数的约束必须与现有参数的约束完全匹配。例如: +当一个类型别名带着泛型参数一起被声明时,这些参数的约束必须与现有参数的约束完全匹配。例如: ```swift typealias DictionaryOfInts = Dictionary ``` -因为类型别名可以和现有类型相互交换使用,类型别名不可以引入额外的类型约束。 -在协议声明中,类型别名可以为那些经常使用的类型提供一个更短更方便的名称,例如: +因为类型别名可以和现有类型相互交换使用,类型别名不可以引入额外的类型约束。 +在协议声明中,类型别名可以为那些经常使用的类型提供一个更短更方便的名称,例如: ```swift protocol Sequence { associatedtype Iterator: IteratorProtocol @@ -353,7 +353,7 @@ func sum(_ sequence: T) -> Int where T.Element == Int { // ... } ``` -假如没有类型别名,sum函数将必须引用关联类型通过T.Iterator.Element的形式来替代 T.Element。 +假如没有类型别名,sum函数将必须引用关联类型通过T.Iterator.Element的形式来替代 T.Element。 另请参阅 [协议关联类型声明](#protocol_associated_type_declaration)。 @@ -538,10 +538,10 @@ func someFunction(callback: () throws -> Void) rethrows { ### 永不返回的函数 -Swift定义了`Never`类型,它表示函数或者方法不会返回给它的调用者。`Never`返回类型的函数或方法可以称为不归,不归函数、方法要么引发不可恢复的错误,要么永远不停地运作,这会使调用后本应执行得代码就不再执行了。但即使是不归函数、方法,抛错函数和重抛出函数也可以将程序控制转移到合适的`catch`代码块。 +Swift定义了`Never`类型,它表示函数或者方法不会返回给它的调用者。`Never`返回类型的函数或方法可以称为不归,不归函数、方法要么引发不可恢复的错误,要么永远不停地运作,这会使调用后本应执行得代码就不再执行了。但即使是不归函数、方法,抛错函数和重抛出函数也可以将程序控制转移到合适的`catch`代码块。 -不归函数、方法可以在guard语句的else字句中调用,具体讨论在[*Guard语句*](10_Statements.md#guard_statements)。 -你可以重载一个不归方法,但是新的方法必须保持原有的返回类型和没有返回的行为。 +不归函数、方法可以在guard语句的else字句中调用,具体讨论在[*Guard语句*](10_Statements.md#guard_statements)。 +你可以重载一个不归方法,但是新的方法必须保持原有的返回类型和没有返回的行为。 > 函数声明语法 @@ -1168,7 +1168,7 @@ infix operator 运算符名称: 优先级组 中缀运算符是二元运算符,置于两个运算对象之间,例如加法运算符(`+`)位于表达式 `1 + 2` 的中间。 -中缀运算符可以选择指定优先级组。如果没有为运算符设置优先级组,Swift会设置默认优先级组`DefaultPrecedence`,它的优先级比三目优先级`TernaryPrecedence`要高,更多内容参考[*优先级组声明*](#precedence_group_declaration_modifiers) +中缀运算符可以选择指定优先级组。如果没有为运算符设置优先级组,Swift会设置默认优先级组`DefaultPrecedence`,它的优先级比三目优先级`TernaryPrecedence`要高,更多内容参考[*优先级组声明*](#precedence_group_declaration_modifiers) 下面的形式声明了一个新的前缀运算符: @@ -1212,7 +1212,7 @@ postfix operator 运算符名称 {} ## 优先级组声明 -*优先级组声明 (A precedence group declaration)* 会向程序的中缀运算符引入一个全新的优先级组。当没有用圆括号分组时,运算符优先级反应了运算符与它的操作数的关系的紧密程度。 +*优先级组声明 (A precedence group declaration)* 会向程序的中缀运算符引入一个全新的优先级组。当没有用圆括号分组时,运算符优先级反应了运算符与它的操作数的关系的紧密程度。 优先级组的声明如下所示: ```swift @@ -1223,16 +1223,16 @@ precedencegroup 优先级组名称{ assignment: 赋值性 } ``` -较低优先级组和较高优先级组的名称说明了新建的优先级组是依赖于现存的优先级组的。 `lowerThan`优先级组的属性只可以引用当前模块外的优先级组。当两个运算符为同一个操作数竞争时,比如表达式`2 + 3 * 5`,优先级更高的运算符将优先参与运算。 +较低优先级组和较高优先级组的名称说明了新建的优先级组是依赖于现存的优先级组的。 `lowerThan`优先级组的属性只可以引用当前模块外的优先级组。当两个运算符为同一个操作数竞争时,比如表达式`2 + 3 * 5`,优先级更高的运算符将优先参与运算。 > 注意 -> 使用较低和较高优先级组相互联系的优先级组必须保持单一层次关系,但它们不必是线性关系。这意味着优先级组也许会有未定义的相关优先级。这些优先级组的运算符在没有用圆括号分组的情况下是不能紧邻着使用的。 +> 使用较低和较高优先级组相互联系的优先级组必须保持单一层次关系,但它们不必是线性关系。这意味着优先级组也许会有未定义的相关优先级。这些优先级组的运算符在没有用圆括号分组的情况下是不能紧邻着使用的。 -Swift定义了大量的优先级组来与标准库的运算符配合使用,例如相加(`+`)和相减(`-`)属于`AdditionPrecedence`组,相乘(`*`)和相除(`/`)属于` MultiplicationPrecedence`组,详细关于Swift标准库中一系列运算符和优先级组内容,参阅[Swift标准库操作符参考](https://developer.apple.com/reference/swift/1851035-swift_standard_library_operators)。 +Swift定义了大量的优先级组来与标准库的运算符配合使用,例如相加(`+`)和相减(`-`)属于`AdditionPrecedence`组,相乘(`*`)和相除(`/`)属于` MultiplicationPrecedence`组,详细关于Swift标准库中一系列运算符和优先级组内容,参阅[Swift标准库操作符参考](https://developer.apple.com/reference/swift/1851035-swift_standard_library_operators)。 -运算符的结合性表示在没有圆括号分组的情况下,同样优先级的一系列运算符是如何被分组的。你可以指定运算符的结合性通过上下文关键字`left`、`right`或者`none`,如果没有指定结合性,默认是`none`关键字。左关联性的运算符是从左至右分组的,例如,相减操作符(-)是左关联性的,所以表达式`4 - 5 - 6`被分组为`(4 - 5) - 6`,得出结果-7。右关联性的运算符是从右往左分组的,指定为`none`结合性的运算符就没有结合性。同样优先级没有结合性的运算符不能相邻出现,例如`<`运算符是`none`结合性,那表示`1 < 2 < 3`就不是一个有效表达式。 +运算符的结合性表示在没有圆括号分组的情况下,同样优先级的一系列运算符是如何被分组的。你可以指定运算符的结合性通过上下文关键字`left`、`right`或者`none`,如果没有指定结合性,默认是`none`关键字。左关联性的运算符是从左至右分组的,例如,相减操作符(-)是左关联性的,所以表达式`4 - 5 - 6`被分组为`(4 - 5) - 6`,得出结果-7。右关联性的运算符是从右往左分组的,指定为`none`结合性的运算符就没有结合性。同样优先级没有结合性的运算符不能相邻出现,例如`<`运算符是`none`结合性,那表示`1 < 2 < 3`就不是一个有效表达式。 -优先级组的赋值性表示在包含可选链操作时的运算符优先级。当设为true时,与优先级组对应的运算符在可选链操作中使用和标准库中赋值运算符同样的分组规则,当设为false或者不设置,该优先级组的运算符与不赋值的运算符遵循同样的可选链规则。 +优先级组的赋值性表示在包含可选链操作时的运算符优先级。当设为true时,与优先级组对应的运算符在可选链操作中使用和标准库中赋值运算符同样的分组规则,当设为false或者不设置,该优先级组的运算符与不赋值的运算符遵循同样的可选链规则。 > 优先级组声明语法 diff --git a/source/chapter3/06_Attributes.md b/source/chapter3/06_Attributes.md index 845109d0..0bc80e3d 100755 --- a/source/chapter3/06_Attributes.md +++ b/source/chapter3/06_Attributes.md @@ -116,7 +116,7 @@ class MyClass { `discardableResult` -该特性用于的函数或方法声明,以抑制编译器中 函数或方法的返回值被调而没有使用其结果的警告。 +该特性用于的函数或方法声明,以抑制编译器中 函数或方法的返回值被调而没有使用其结果的警告。 `GKInspectable` @@ -153,7 +153,7 @@ var enabled: Bool { 在类上使用该特性表示该类是应用程序委托类,使用该特性与调用 `NSApplicationMain`(\_:_:) 函数并且把该类的名字作为委托类的名字传递给函数的效果相同。 -如果你不想使用这个特性,可以提供一个 main.swift 文件,并在代码**顶层**调用`NSApplicationMain`(\_:_:) 函数,如下所示: +如果你不想使用这个特性,可以提供一个 main.swift 文件,并在代码**顶层**调用`NSApplicationMain`(\_:_:) 函数,如下所示: ```swift import AppKit @@ -171,7 +171,7 @@ NSApplicationMain(CommandLine.argc, CommandLine.unsafeArgv) `testable` -在导入允许测试的编译模块时,该特性用于修饰 `import` 声明,这样就能访问被导入模块中的任何标有 `internal` 访问级别修饰符的实体,犹如它们被标记了 `public` 访问级别修饰符。测试也可以访问使用`internal`或者`public`访问级别修饰符标记的类和类成员,就像它们是`open`访问修饰符声明的。 +在导入允许测试的编译模块时,该特性用于修饰 `import` 声明,这样就能访问被导入模块中的任何标有 `internal` 访问级别修饰符的实体,犹如它们被标记了 `public` 访问级别修饰符。测试也可以访问使用`internal`或者`public`访问级别修饰符标记的类和类成员,就像它们是`open`访问修饰符声明的。 `UIApplicationMain` diff --git a/source/chapter3/08_Generic_Parameters_and_Arguments.md b/source/chapter3/08_Generic_Parameters_and_Arguments.md index 0f8d459c..7ba27749 100755 --- a/source/chapter3/08_Generic_Parameters_and_Arguments.md +++ b/source/chapter3/08_Generic_Parameters_and_Arguments.md @@ -59,7 +59,7 @@ simpleMax(3.14159, 2.71828) // T 被推断为 Double 类型 > `where` : `类型要求` -`where` 子句中的要求用于指明该类型形参继承自某个类或符合某个协议或协议组合。尽管 `where` 子句提供了语法糖使其有助于表达类型形参上的简单约束(如 `` 等同于 ` where T: Comparable`,等等),但是依然可以用来对类型形参及其关联类型提供更复杂的约束,例如你可以强制形参的关联类型遵守协议,如,` where S.Iterator.Element: Equatable` 表示泛型类型 `S` 遵守`Sequence`协议并且关联类型`S.Iterator.Element`遵守`Equatable`协议,这个约束确保队列的每一个元素都是符合 `Equatable` 协议的。 +`where` 子句中的要求用于指明该类型形参继承自某个类或符合某个协议或协议组合。尽管 `where` 子句提供了语法糖使其有助于表达类型形参上的简单约束(如 `` 等同于 ` where T: Comparable`,等等),但是依然可以用来对类型形参及其关联类型提供更复杂的约束,例如你可以强制形参的关联类型遵守协议,如,` where S.Iterator.Element: Equatable` 表示泛型类型 `S` 遵守`Sequence`协议并且关联类型`S.Iterator.Element`遵守`Equatable`协议,这个约束确保队列的每一个元素都是符合 `Equatable` 协议的。 也可以用操作符 `==` 来指定两个类型必须相同。例如,泛型形参子句 ` where S1.Iterator.Element == S2.Iterator.Element` 表示 `S1` 和 `S2` 必须都符合 `SequenceType` 协议,而且两个序列中的元素类型必须相同。 @@ -67,7 +67,7 @@ simpleMax(3.14159, 2.71828) // T 被推断为 Double 类型 泛型函数或构造器可以重载,但在泛型形参子句中的类型形参必须有不同的约束或要求,抑或二者皆不同。当调用重载的泛型函数或构造器时,编译器会根据这些约束来决定调用哪个重载函数或构造器。 -更多关于泛型where从句的信息和关于泛型函数声明的例子,可以看一看 [泛型where子句](https://github.com/numbbbbb/the-swift-programming-language-in-chinese/blob/gh-pages/source/chapter2/23_Generics.md#where_clauses) +更多关于泛型where从句的信息和关于泛型函数声明的例子,可以看一看 [泛型where子句](https://github.com/numbbbbb/the-swift-programming-language-in-chinese/blob/gh-pages/source/chapter2/23_Generics.md#where_clauses) > 泛型形参子句语法 diff --git a/source/chapter3/09_Summary_of_the_Grammar.md b/source/chapter3/09_Summary_of_the_Grammar.md index ac7c3688..ec5ce6e6 100755 --- a/source/chapter3/09_Summary_of_the_Grammar.md +++ b/source/chapter3/09_Summary_of_the_Grammar.md @@ -529,8 +529,8 @@ > *平衡令牌* → **(** [*平衡令牌集*](../chapter3/06_Attributes.html#balanced_tokens) _可选_ **)** > *平衡令牌* → **[** [*平衡令牌集*](../chapter3/06_Attributes.html#balanced_tokens) _可选_ **]** > *平衡令牌* → **{** [*平衡令牌集*](../chapter3/06_Attributes.html#balanced_tokens) _可选_ **}** -> *平衡令牌* → **任意标识符, 关键字, 字面量或运算符** -> *平衡令牌* → **任意标点除了(, ), [, ], {, 或 }** +> *平衡令牌* → **任意标识符、关键字、字面量或运算符** +> *平衡令牌* → **任意标点除了(, )、[, ]、{, 或 }** ## 表达式 diff --git a/source/chapter3/10_Statements.md b/source/chapter3/10_Statements.md index 57ccb9d9..28ef3d6e 100755 --- a/source/chapter3/10_Statements.md +++ b/source/chapter3/10_Statements.md @@ -609,7 +609,7 @@ do { 第一种的行控制语句会改变该语句之后的代码中的字面量表达式 `#line` 和 `#file` 所表示的值。`行号` 是一个大于 0 的整形字面量,会改变 `#line` 表达式的值。`文件名` 是一个字符串字面量,会改变 `#file` 表达式的值。 -第二种的行控制语句, `#sourceLocation()`,会将源代码的定位信息重置回默认的行号和文件名。 +第二种的行控制语句,`#sourceLocation()`,会将源代码的定位信息重置回默认的行号和文件名。 > 行控制语句语法