From b807a6edb94f891156fde045b54f42f9d1e59dc5 Mon Sep 17 00:00:00 2001 From: sunset wan Date: Sat, 29 Jun 2019 19:34:54 +0800 Subject: [PATCH 1/4] Complete the translation of issue 937 and 935. --- source/chapter2/06_Functions.md | 21 +++++++++++++++++++++ source/chapter2/14_Initialization.md | 12 ++++++++++++ 2 files changed, 33 insertions(+) diff --git a/source/chapter2/06_Functions.md b/source/chapter2/06_Functions.md index ff737f3d..3b643de6 100755 --- a/source/chapter2/06_Functions.md +++ b/source/chapter2/06_Functions.md @@ -202,6 +202,27 @@ if let bounds = minMax(array: [8, -6, 2, 109, 3, 71]) { // 打印“min is -6 and max is 109” ``` +### 隐式返回的函数 +如果一个函数的整个函数体是一个单行表达式,这个函数可以隐式地返回这个表达式。举个例子,以下的函数有着同样的作用: + +``` +func greeting(for person: String) -> String { + "Hello, " + person + "!" +} +print(greeting(for: "Dave")) +// 打印 "Hello, Dave!" + +func anotherGreeting(for person: String) -> String { + return "Hello, " + person + "!" +} +print(anotherGreeting(for: "Dave")) +// 打印 "Hello, Dave!" +``` + +greeting(for:) 函数的整个定义是它返回的一条打招呼的信息,这就意味着这个函数可以使用这个更短的隐式返回形式。anothergreeting(for:) 函数使用了 return 关键词返回同样的信息,这看上去像一个更长的函数。任何一个可以被写成一行 return 语句的函数都可以忽略 return。 + +正如你将会在 [简略的 Getter 声明](https://docs.swift.org/swift-book/LanguageGuide/Properties.html#ID608) 里看到的, 一个属性的 getter 也可以使用隐式返回的形式。 + ## 函数参数标签和参数名称 {#Function-Argument-Labels-and-Parameter-Names} 每个函数参数都有一个*参数标签(argument label)*以及一个*参数名称(parameter name)*。参数标签在调用函数的时候使用;调用的时候需要将函数的参数标签写在对应的参数前面。参数名称在函数的实现中使用。默认情况下,函数参数使用参数名称来作为它们的参数标签。 diff --git a/source/chapter2/14_Initialization.md b/source/chapter2/14_Initialization.md index f6bfe603..0ab872d0 100755 --- a/source/chapter2/14_Initialization.md +++ b/source/chapter2/14_Initialization.md @@ -240,6 +240,18 @@ struct Size { let twoByTwo = Size(width: 2.0, height: 2.0) ``` +当你调用一个逐一成员构造器(memberwise initializer)时,你可以忽略任何一个有默认值的属性。在以上提到的例子中,这个 Size 结构体的 height 和 width 属性各有一个默认值。你可以忽略两者或两者之一,并且这个结构体的构造器会使用任何你忽略的属性的默认值来完成构造。举个例子: +``` +let zeroByTwo = Size(height: 2.0) +print(zeroByTwo.width, zeroByTwo.height) +// 打印 "0.0 2.0" + +let zeroByZero = Size() +print(zeroByZero.width, zeroByZero.height) +// 打印 "0.0 0.0" +``` + + ## 值类型的构造器代理 {#initializer-delegation-for-value-types} 构造器可以通过调用其它构造器来完成实例的部分构造过程。这一过程称为*构造器代理*,它能避免多个构造器间的代码重复。 From b5defb4c0e537d248dd0b79cfef95ef83b1d36b2 Mon Sep 17 00:00:00 2001 From: sunset wan Date: Sun, 30 Jun 2019 18:55:05 +0800 Subject: [PATCH 2/4] Complete the translation of issue 942 and 941. --- source/chapter2/01_The_Basics.md | 2 +- source/chapter2/12_Subscripts.md | 19 +++++++++++++++++-- 2 files changed, 18 insertions(+), 3 deletions(-) diff --git a/source/chapter2/01_The_Basics.md b/source/chapter2/01_The_Basics.md index ed981656..6fc825d3 100755 --- a/source/chapter2/01_The_Basics.md +++ b/source/chapter2/01_The_Basics.md @@ -481,7 +481,7 @@ print("The status message is \(http200Status.description)") > 注意 > -> 元组在临时组织值的时候很有用,但是并不适合创建复杂的数据结构。如果你的数据结构并不是临时使用,请使用类或者结构体而不是元组。请参考 [类和结构体](./09_Classes_and_Structures.md)。 +> 当遇到一些相关值的简单分组时,元组是很有用的。元组不适合用来创建复杂的数据结构。如果你的数据结构可能是错综复杂的,请把你的数据结构用类或者结构体去建模,而不是使用元组。欲获得更多信息,请参考 [结构体和类](https://docs.swift.org/swift-book/LanguageGuide/ClassesAndStructures.html)。 ## 可选类型 {#optionals} diff --git a/source/chapter2/12_Subscripts.md b/source/chapter2/12_Subscripts.md index c5aa4c0d..f7ddefb0 100755 --- a/source/chapter2/12_Subscripts.md +++ b/source/chapter2/12_Subscripts.md @@ -72,7 +72,7 @@ numberOfLegs["bird"] = 2 ## 下标选项 {#subscript-options} -下标可以接受任意数量的入参,并且这些入参可以是任意类型。下标的返回值也可以是任意类型。下标可以使用变量参数和可变参数,但不能使用输入输出参数,也不能给参数设置默认值。 +下标可以接受任意数量的入参,并且这些入参可以是任意类型。下标的返回值也可以是任意类型。下标可以使用可变参数,并且可以提供默认参数数值,但是不能使用输入输出参数。 一个类或结构体可以根据自身需要提供多个下标实现,使用下标时将通过入参的数量和类型进行区分,自动匹配合适的下标,这就是*下标的重载*。 @@ -139,4 +139,19 @@ func indexIsValid(row: Int, column: Int) -> Bool { ```swift let someValue = matrix[2, 2] // 断言将会触发,因为 [2, 2] 已经超过了 matrix 的范围 -``` +``` + +## 类型下标{#type-subscripts} +正如上节所述,实例下标是在特定类型的一个实例上调用的下标。你也可以定义一种在这个类型本身上调用的下标。这种下标的类型被称作类型下标。你可以通过在 subscript 关键词之前写下 static 关键字的方式来表示一个类型下标。类可以使用 class 关键字来允许子类重写父类中对那个下标的实现。以下的例子表明你应怎样定义和调用一个类型下标: + +``` +enum Planet: Int { + case mercury = 1, venus, earth, mars, jupiter, saturn, uranus, neptune + static subscript(n: Int) -> Planet { + return Planet(rawValue: n)! + } +} +let mars = Planet[4] +print(mars) +``` + From d90c50ec74d7fa5ce54bddc11ffb68065e48f5d4 Mon Sep 17 00:00:00 2001 From: sunset wan Date: Mon, 1 Jul 2019 00:06:35 +0800 Subject: [PATCH 3/4] Refine the translation. --- source/chapter2/01_The_Basics.md | 2 +- source/chapter2/06_Functions.md | 6 +++--- source/chapter2/12_Subscripts.md | 3 +-- source/chapter2/14_Initialization.md | 2 +- 4 files changed, 6 insertions(+), 7 deletions(-) diff --git a/source/chapter2/01_The_Basics.md b/source/chapter2/01_The_Basics.md index 6fc825d3..240f7e2e 100755 --- a/source/chapter2/01_The_Basics.md +++ b/source/chapter2/01_The_Basics.md @@ -481,7 +481,7 @@ print("The status message is \(http200Status.description)") > 注意 > -> 当遇到一些相关值的简单分组时,元组是很有用的。元组不适合用来创建复杂的数据结构。如果你的数据结构可能是错综复杂的,请把你的数据结构用类或者结构体去建模,而不是使用元组。欲获得更多信息,请参考 [结构体和类](https://docs.swift.org/swift-book/LanguageGuide/ClassesAndStructures.html)。 +> 当遇到一些相关值的简单分组时,元组是很有用的。元组不适合用来创建复杂的数据结构。如果你的数据结构可能是错综复杂的,请把你的数据结构用类或者结构体去建模,而不是使用元组。欲获得更多信息,请参考 [结构体和类](./09_Classes_and_Structures.md)。 ## 可选类型 {#optionals} diff --git a/source/chapter2/06_Functions.md b/source/chapter2/06_Functions.md index 3b643de6..7fcaf70a 100755 --- a/source/chapter2/06_Functions.md +++ b/source/chapter2/06_Functions.md @@ -202,7 +202,7 @@ if let bounds = minMax(array: [8, -6, 2, 109, 3, 71]) { // 打印“min is -6 and max is 109” ``` -### 隐式返回的函数 +### 隐式返回的函数 {#functions-with-an-implicit-return} 如果一个函数的整个函数体是一个单行表达式,这个函数可以隐式地返回这个表达式。举个例子,以下的函数有着同样的作用: ``` @@ -219,9 +219,9 @@ print(anotherGreeting(for: "Dave")) // 打印 "Hello, Dave!" ``` -greeting(for:) 函数的整个定义是它返回的一条打招呼的信息,这就意味着这个函数可以使用这个更短的隐式返回形式。anothergreeting(for:) 函数使用了 return 关键词返回同样的信息,这看上去像一个更长的函数。任何一个可以被写成一行 return 语句的函数都可以忽略 return。 +`greeting(for:)` 函数的完整定义是打招呼内容的返回,这就意味着它能使用隐式返回这样更简短的形式。`anothergreeting(for:)` 函数返回同样的内容,却因为 `return` 关键字显得函数更长。任何一个可以被写成一行 `return` 语句的函数都可以忽略 `return`。 -正如你将会在 [简略的 Getter 声明](https://docs.swift.org/swift-book/LanguageGuide/Properties.html#ID608) 里看到的, 一个属性的 getter 也可以使用隐式返回的形式。 +正如你将会在 [简略的 Getter 声明](./10_Properties.md) 里看到的, 一个属性的 getter 也可以使用隐式返回的形式。 ## 函数参数标签和参数名称 {#Function-Argument-Labels-and-Parameter-Names} diff --git a/source/chapter2/12_Subscripts.md b/source/chapter2/12_Subscripts.md index f7ddefb0..e6d1862a 100755 --- a/source/chapter2/12_Subscripts.md +++ b/source/chapter2/12_Subscripts.md @@ -142,8 +142,7 @@ let someValue = matrix[2, 2] ``` ## 类型下标{#type-subscripts} -正如上节所述,实例下标是在特定类型的一个实例上调用的下标。你也可以定义一种在这个类型本身上调用的下标。这种下标的类型被称作类型下标。你可以通过在 subscript 关键词之前写下 static 关键字的方式来表示一个类型下标。类可以使用 class 关键字来允许子类重写父类中对那个下标的实现。以下的例子表明你应怎样定义和调用一个类型下标: - +正如上节所述,实例下标是在特定类型的一个实例上调用的下标。你也可以定义一种在这个类型本身上调用的下标。这种下标的类型被称作类型下标。你可以通过在 `subscript` 关键字之前写下 `static` 关键字的方式来表示一个类型下标。类可以使用 `class` 关键字来允许子类重写父类中对那个下标的实现。下面的例子展示了如何定义和调用一个类型下标: ``` enum Planet: Int { case mercury = 1, venus, earth, mars, jupiter, saturn, uranus, neptune diff --git a/source/chapter2/14_Initialization.md b/source/chapter2/14_Initialization.md index 0ab872d0..88aae0d0 100755 --- a/source/chapter2/14_Initialization.md +++ b/source/chapter2/14_Initialization.md @@ -240,7 +240,7 @@ struct Size { let twoByTwo = Size(width: 2.0, height: 2.0) ``` -当你调用一个逐一成员构造器(memberwise initializer)时,你可以忽略任何一个有默认值的属性。在以上提到的例子中,这个 Size 结构体的 height 和 width 属性各有一个默认值。你可以忽略两者或两者之一,并且这个结构体的构造器会使用任何你忽略的属性的默认值来完成构造。举个例子: +当你调用一个逐一成员构造器(memberwise initializer)时,可以省略任何一个有默认值的属性。在上面这个例子中,`Size` 结构体的 `height` 和 `width` 属性各有一个默认值。你可以省略两者或两者之一,对于被省略的属性,构造器会使用默认值。举个例子: ``` let zeroByTwo = Size(height: 2.0) print(zeroByTwo.width, zeroByTwo.height) From 787687cb1e0f5cda2527b312ce02ac80ce1ffc5d Mon Sep 17 00:00:00 2001 From: sunset wan Date: Mon, 1 Jul 2019 13:40:57 +0800 Subject: [PATCH 4/4] Refine the translation. --- source/chapter2/01_The_Basics.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/chapter2/01_The_Basics.md b/source/chapter2/01_The_Basics.md index 240f7e2e..f124536e 100755 --- a/source/chapter2/01_The_Basics.md +++ b/source/chapter2/01_The_Basics.md @@ -481,7 +481,7 @@ print("The status message is \(http200Status.description)") > 注意 > -> 当遇到一些相关值的简单分组时,元组是很有用的。元组不适合用来创建复杂的数据结构。如果你的数据结构可能是错综复杂的,请把你的数据结构用类或者结构体去建模,而不是使用元组。欲获得更多信息,请参考 [结构体和类](./09_Classes_and_Structures.md)。 +> 当遇到一些相关值的简单分组时,元组是很有用的。元组不适合用来创建复杂的数据结构。如果你的数据结构比较复杂,不要使用元组,用类或结构体去建模。欲获得更多信息,请参考 [结构体和类](./09_Classes_and_Structures.md)。 ## 可选类型 {#optionals}