From 852fbbe628f377e626782f49f9224efb500082fc Mon Sep 17 00:00:00 2001 From: Leo Zhou Date: Sun, 11 Oct 2015 15:36:00 +0800 Subject: [PATCH 1/4] =?UTF-8?q?3-6=20Declarations=20=E6=9B=B4=E6=96=B0?= =?UTF-8?q?=E5=AE=8C=E6=88=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- source/chapter3/05_Declarations.md | 26 ++++++++++++++++++++++---- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/source/chapter3/05_Declarations.md b/source/chapter3/05_Declarations.md index 541dbef4..4b7b4787 100755 --- a/source/chapter3/05_Declarations.md +++ b/source/chapter3/05_Declarations.md @@ -7,7 +7,8 @@ > 校对:[numbbbbb](https://github.com/numbbbbb), [stanzhai](https://github.com/stanzhai) > 2.0 -> 翻译+校对:[Lenhoon](https://github.com/Lenhoon) +> 翻译+校对:[Lenhoon](https://github.com/Lenhoon), +> [BridgeQ](https://github.com/WXGBridgeQ) 本页包含内容: @@ -487,7 +488,7 @@ plusOne(10) ###任意事件类型的枚举 -如下的形式声明了一个包含任意类型枚举时间的枚举变量 +如下的形式声明了一个包含任意类型枚举事件的枚举变量 > enum `enumeration name`: `adopted protocols`{ > case `enumeration case 1` @@ -496,8 +497,25 @@ plusOne(10) 这种形式的枚举声明在其他语言中有时被叫做*可识别联合(discrinminated)*。 -这种形式中,每一个事件块由关键字`case`开始,后面紧接着一个或多个以逗号分隔的枚举事件。每一个事件名必须是独一无二的。每一个事件也可以指定它所存储的指定类型的值,这些类型在*关联值类型(associated values types)*的元组里被指定,立即书写在事件 -名后。获得更多关于关联值类型的信息和例子,请查看[关联值(Associated Values)](TODO)一节。 +这种形式中,每一个事件块由关键字`case`开始,后面紧接着一个或多个以逗号分隔的枚举事件。每一个事件名必须是独一无二的。每一个事件也可以指定它所存储的指定类型的值,这些类型在*关联值类型(associated values types)*的元组里被指定,立即书写在事件名后。 + +枚举事件也可以指定函数作为其存储的值,从而通过特定的关联值创建一个枚举实例。和真正的函数一样,你可以获取一个枚举事件的引用,以便在后续代码中使用它。 + +```swift +enum Number { + case Integer(Int) + case Real(Double) +} +let f = Number.Integer +// f is a function of type (Int) -> Number +// f 是一个传入 Int 返回 Number 类型的函数 + +// Apply f to create an array of Number instances with integer values +// 利用函数 f 把一个整数数组转成 Number 数组 +let evenInts: [Number] = [0, 2, 4, 6].map(f) +``` + +获得更多关于关联值类型的信息和例子,请查看[关联值(Associated Values)](TODO)一节。 枚举有一个递归结构,就是说,枚举有着枚举类型自身实例的关联值的事件。然而,枚举类型的实例有值语义,意味着它们在内存中有着固定的位置。为了支持递归,编译器必需插入一个间接层。 From b58f66e6c4de7801f9eb213d50e014b8554a56e6 Mon Sep 17 00:00:00 2001 From: Leo Zhou Date: Sun, 11 Oct 2015 15:52:19 +0800 Subject: [PATCH 2/4] =?UTF-8?q?3-8=20Patterns=20=E6=9B=B4=E6=96=B0?= =?UTF-8?q?=E5=AE=8C=E6=88=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- source/chapter3/07_Patterns.md | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/source/chapter3/07_Patterns.md b/source/chapter3/07_Patterns.md index 056cdd22..d9aa54c2 100755 --- a/source/chapter3/07_Patterns.md +++ b/source/chapter3/07_Patterns.md @@ -6,7 +6,8 @@ > 校对:[numbbbbb](https://github.com/numbbbbb), [stanzhai](https://github.com/stanzhai) > 2.0 -> 翻译+校对:[ray16897188](https://github.com/ray16897188) +> 翻译+校对:[ray16897188](https://github.com/ray16897188), +> [BridgeQ](https://github.com/WXGBridgeQ) 本页内容包括: @@ -132,7 +133,7 @@ let (a): Int = 2 // a: Int = 2 ## 可选模式(Optional Pattern) -可选模式与封装在一个`Optional(T)`或者一个`ExplicitlyUnwrappedOptional(T)`枚举中的`Some(T)`用例相匹配。可选模式由一个标识符模式和紧随其后的一个问号组成,在某些情况下表现为枚举用例模式。 +可选模式与封装在一个`Optional(Wrapped)`或者一个`ExplicitlyUnwrappedOptional(Wrapped)`枚举中的`Some(Wrapped)`用例相匹配。可选模式由一个标识符模式和紧随其后的一个问号组成,在某些情况下表现为枚举用例模式。 由于可选模式是`optional`和`ImplicitlyUnwrappedOptional`枚举用例模式的语法糖(syntactic sugar),下面的2种写法是一样的: From 3afe03be4afddd3d591ef35167cf8cc853bd5d33 Mon Sep 17 00:00:00 2001 From: Leo Zhou Date: Sun, 11 Oct 2015 16:14:28 +0800 Subject: [PATCH 3/4] =?UTF-8?q?3-6=20Declarations=20=E4=B8=AD=EF=BC=8C?= =?UTF-8?q?=E5=B0=86=20case=20=E7=9A=84=E7=BF=BB=E8=AF=91=E4=BB=8E?= =?UTF-8?q?=E4=BA=8B=E4=BB=B6=E6=94=B9=E4=B8=BA=E7=94=A8=E4=BE=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- source/chapter3/05_Declarations.md | 38 +++++++++++++++--------------- 1 file changed, 19 insertions(+), 19 deletions(-) diff --git a/source/chapter3/05_Declarations.md b/source/chapter3/05_Declarations.md index 4b7b4787..594ba05f 100755 --- a/source/chapter3/05_Declarations.md +++ b/source/chapter3/05_Declarations.md @@ -474,11 +474,11 @@ plusOne(10) 在程序里使用*枚举声明(enumeration)*来引入一个枚举类型。 -枚举声明有两种基本的形式,使用关键字`enum`来声明。枚举声明体使用从零开始的变量——叫做*枚举事件(enumeration cases)*,和任意数量的声明,包括计算型属性,实例方法,类型方法,构造器,类型别名,甚至其他枚举,结构体,和类。枚举声明不能包含析构器或者协议声明。 +枚举声明有两种基本的形式,使用关键字`enum`来声明。枚举声明体使用从零开始的变量——叫做*枚举用例(enumeration cases)*,和任意数量的声明,包括计算型属性,实例方法,类型方法,构造器,类型别名,甚至其他枚举,结构体,和类。枚举声明不能包含析构器或者协议声明。 枚举类型可以采用任何数量的协议,但是这些协议不能从类,结构体和其他的枚举继承。 -不像类或者结构体。枚举类型并不提供隐式的初始构造器,所有构造器必须显式的声明。构造器可以委托枚举中的其他构造器,但是构造过程仅当构造器将一个枚事件指定给`self`才全部完成。 +不像类或者结构体。枚举类型并不提供隐式的初始构造器,所有构造器必须显式的声明。构造器可以委托枚举中的其他构造器,但是构造过程仅当构造器将一个枚用例指定给`self`才全部完成。 和结构体类似但是和类不同,枚举是值类型:枚举实例在赋予变量或常量时,或者被函数调用时被复制。 更多关于值类型的信息,参见结构体和枚举都是[值类型(Structures and Enumerations Are Value Types)](TODO)一节。 @@ -486,9 +486,9 @@ plusOne(10) 可以扩展枚举类型,正如在[扩展声明(Extension Declaration)](TODO)中讨论的一样。 -###任意事件类型的枚举 +###任意用例类型的枚举 -如下的形式声明了一个包含任意类型枚举事件的枚举变量 +如下的形式声明了一个包含任意类型枚举用例的枚举变量 > enum `enumeration name`: `adopted protocols`{ > case `enumeration case 1` @@ -497,9 +497,9 @@ plusOne(10) 这种形式的枚举声明在其他语言中有时被叫做*可识别联合(discrinminated)*。 -这种形式中,每一个事件块由关键字`case`开始,后面紧接着一个或多个以逗号分隔的枚举事件。每一个事件名必须是独一无二的。每一个事件也可以指定它所存储的指定类型的值,这些类型在*关联值类型(associated values types)*的元组里被指定,立即书写在事件名后。 +这种形式中,每一个用例块由关键字`case`开始,后面紧接着一个或多个以逗号分隔的枚举用例。每一个用例名必须是独一无二的。每一个用例也可以指定它所存储的指定类型的值,这些类型在*关联值类型(associated values types)*的元组里被指定,立即书写在用例名后。 -枚举事件也可以指定函数作为其存储的值,从而通过特定的关联值创建一个枚举实例。和真正的函数一样,你可以获取一个枚举事件的引用,以便在后续代码中使用它。 +枚举用例也可以指定函数作为其存储的值,从而通过特定的关联值创建一个枚举实例。和真正的函数一样,你可以获取一个枚举用例的引用,然后在后续代码中调用它。 ```swift enum Number { @@ -517,33 +517,33 @@ let evenInts: [Number] = [0, 2, 4, 6].map(f) 获得更多关于关联值类型的信息和例子,请查看[关联值(Associated Values)](TODO)一节。 -枚举有一个递归结构,就是说,枚举有着枚举类型自身实例的关联值的事件。然而,枚举类型的实例有值语义,意味着它们在内存中有着固定的位置。为了支持递归,编译器必需插入一个间接层。 +枚举有一个递归结构,就是说,枚举有着枚举类型自身实例的关联值的用例。然而,枚举类型的实例有值语义,意味着它们在内存中有着固定的位置。为了支持递归,编译器必需插入一个间接层。 -为间接使用特殊的枚举事件,使用`indirect`声明修饰符标记。 +为间接使用特殊的枚举用例,使用`indirect`声明修饰符标记。 > enum Tree { > case Empty > indirect case Node(value: T, left: Tree, right:Tree) > } -为了间接的使用一个枚举的所有事件,使用`indirect`修饰符标记整个枚举-当枚举有许多事件且每个事件都需要使用`indirect`修饰符标记的时候这将非常便利。 +为了间接的使用一个枚举的所有用例,使用`indirect`修饰符标记整个枚举-当枚举有许多用例且每个用例都需要使用`indirect`修饰符标记的时候这将非常便利。 -一个被`indirect`修饰符标记的枚举事件必需有一个关联值。一个使用`indirect`修饰符标记的枚举包含有着关联值的事件和没有关联值的事件的混合。就是说,它不能包含任何也使用`indirect`修饰符标记的事件。 +一个被`indirect`修饰符标记的枚举用例必需有一个关联值。一个使用`indirect`修饰符标记的枚举包含有着关联值的用例和没有关联值的用例的混合。就是说,它不能包含任何也使用`indirect`修饰符标记的用例。 -###使用原始值类型事件的枚举(Enumerations with Cases of a Raw-Value Type) +###使用原始值类型用例的枚举(Enumerations with Cases of a Raw-Value Type) -以下的形式声明了一个包含相同基础类型的枚举事件的枚举: +以下的形式声明了一个包含相同基础类型的枚举用例的枚举: > enum `enumeration name`: `raw value type`, `adopted protocols`{ > case `enumeration case 1` = `raw value 1` > case `enumeration case 2` = `raw value 2` > } -在这种形式中,每一个事件块由`case`关键字开始,后面紧接着一个或多个以逗号分隔的枚举事件。和第一种形式的枚举事件不同,这种形式的枚举事件包含一个同类型的基础值,叫做*原始值(raw value)*。这些值的类型在*原始值类型(raw-value type)*中被指定,必须表示一个整数,浮点数,字符串,或者一个字符。特别是*原始值类型(raw-value type)*必需遵守`Equatable`类型的协议和下列形式中的一种字面量构造协议(literal-convertible protocols):整型字面量有`IntergerLiteralConvertible`,浮点行字面量有`FloatingPointLiteralConvertible`,包含任意数量字符的字符串型字面量有`StringLiteralConvertible`,仅包含一个单一字符的字符串型字面量有`ExtendedGraphemeClusterLiteralConvertible`。每一个事件必须有唯一的名字,必须有一个唯一的初始值。 +在这种形式中,每一个用例块由`case`关键字开始,后面紧接着一个或多个以逗号分隔的枚举用例。和第一种形式的枚举用例不同,这种形式的枚举用例包含一个同类型的基础值,叫做*原始值(raw value)*。这些值的类型在*原始值类型(raw-value type)*中被指定,必须表示一个整数,浮点数,字符串,或者一个字符。特别是*原始值类型(raw-value type)*必需遵守`Equatable`类型的协议和下列形式中的一种字面量构造协议(literal-convertible protocols):整型字面量有`IntergerLiteralConvertible`,浮点行字面量有`FloatingPointLiteralConvertible`,包含任意数量字符的字符串型字面量有`StringLiteralConvertible`,仅包含一个单一字符的字符串型字面量有`ExtendedGraphemeClusterLiteralConvertible`。每一个用例必须有唯一的名字,必须有一个唯一的初始值。 -如果初始值类型被指定为`Int`,则不必为事件显式的指定值,它们会隐式的被标为值`0,1,2`等。每一个没有被赋值的`Int`类型时间会隐式的赋予一个初始值,它们是自动递增的。 +如果初始值类型被指定为`Int`,则不必为用例显式的指定值,它们会隐式的被标为值`0,1,2`等。每一个没有被赋值的`Int`类型时间会隐式的赋予一个初始值,它们是自动递增的。 ```Swift num ExampleEnum: Int { @@ -553,7 +553,7 @@ num ExampleEnum: Int { 在上面的例子中,`ExampleEnum.A`的值是`0`,`ExampleEnum.B`的值是`1`。因为`ExampleEnum.C`的值被显式的设定为`5`,因此`ExampleEnum.D`的值会自动增长为`6`。 -如果原始值类型被指定为`String`类型,你不用明确的为事件指定值,每一个没有指定的事件会隐式地用与事件名字相同的字符串指定。 +如果原始值类型被指定为`String`类型,你不用明确的为用例指定值,每一个没有指定的用例会隐式地用与用例名字相同的字符串指定。 > enum WeekendDay: String { > case Saturday, Sunday @@ -561,14 +561,14 @@ num ExampleEnum: Int { 在上面这个例子中,`WeekendDay.Saturday`的原始值是`"Saturday"`,`WeekendDay.Sunday`的原始值是`"Sunday"`。 -拥有多种事件的原始值类型的枚举含蓄地遵循定义在Swift标准库中的`RawRepresentable`协议。所以,它们拥有一个原始值(`rawValue`)属性和一个有着`init?(rawValue: RawValue)`签名的可失败构造器(a failable initializer)。可以使用原始值属性去取的枚举事件的原始值,就像在`ExampleEnum.B.rawValue`中一样。如果有一个事件符合,也可以使用原始值去找到一个符合的事件,通过调用枚举的可失败构造器,如`ExampleEnum(rawValue: 5)`,这个可失败构造器返回一个可选的事件。想得到更多的信息和关于原始值类型查看更多信息和获取初始值类型事件的信息,参阅初始值[原始值(Raw Values)](TODO)。 +拥有多种用例的原始值类型的枚举含蓄地遵循定义在Swift标准库中的`RawRepresentable`协议。所以,它们拥有一个原始值(`rawValue`)属性和一个有着`init?(rawValue: RawValue)`签名的可失败构造器(a failable initializer)。可以使用原始值属性去取的枚举用例的原始值,就像在`ExampleEnum.B.rawValue`中一样。如果有一个用例符合,也可以使用原始值去找到一个符合的用例,通过调用枚举的可失败构造器,如`ExampleEnum(rawValue: 5)`,这个可失败构造器返回一个可选的用例。想得到更多的信息和关于原始值类型查看更多信息和获取初始值类型用例的信息,参阅初始值[原始值(Raw Values)](TODO)。 -###获得枚举事件 +###获得枚举用例 -使用点(.)来引用枚举类型的事件,如`EnumerationType.EnumerationCase`。当枚举类型可以上下文推断出时,可以省略它(.仍然需要),参照枚举语法[(Enumeration Syntax)](TODO)和[显式成员表达(Implicit Member Expression)](TODO)。 +使用点(.)来引用枚举类型的用例,如`EnumerationType.EnumerationCase`。当枚举类型可以上下文推断出时,可以省略它(.仍然需要),参照枚举语法[(Enumeration Syntax)](TODO)和[显式成员表达(Implicit Member Expression)](TODO)。 -使用`switch`语句来检验枚举事件的值,正如使用[switch语句匹配枚举值(Matching Enumeration Values with a Switch Statement)](TODO)一节描述的那样。枚举类型是模式匹配(pattern-matched)的,和其相反的是`switch`语句case块中枚举事件匹配,在[枚举事件类型(Enumeration Case Pattern)](TODO)中有描述。 +使用`switch`语句来检验枚举用例的值,正如使用[switch语句匹配枚举值(Matching Enumeration Values with a Switch Statement)](TODO)一节描述的那样。枚举类型是模式匹配(pattern-matched)的,和其相反的是`switch`语句case块中枚举用例匹配,在[枚举用例类型(Enumeration Case Pattern)](TODO)中有描述。 > 枚举声明语法 From 5f2ed655710f6f99cd4a0c3625461a00faf69faf Mon Sep 17 00:00:00 2001 From: Leo Zhou Date: Sun, 11 Oct 2015 16:51:24 +0800 Subject: [PATCH 4/4] Update 05_Declarations.md --- source/chapter3/05_Declarations.md | 42 +++++++++++++++--------------- 1 file changed, 21 insertions(+), 21 deletions(-) diff --git a/source/chapter3/05_Declarations.md b/source/chapter3/05_Declarations.md index 594ba05f..7a66795a 100755 --- a/source/chapter3/05_Declarations.md +++ b/source/chapter3/05_Declarations.md @@ -7,7 +7,7 @@ > 校对:[numbbbbb](https://github.com/numbbbbb), [stanzhai](https://github.com/stanzhai) > 2.0 -> 翻译+校对:[Lenhoon](https://github.com/Lenhoon), +> 翻译+校对:[Lenhoon](https://github.com/Lenhoon), > [BridgeQ](https://github.com/WXGBridgeQ) 本页包含内容: @@ -478,7 +478,7 @@ plusOne(10) 枚举类型可以采用任何数量的协议,但是这些协议不能从类,结构体和其他的枚举继承。 -不像类或者结构体。枚举类型并不提供隐式的初始构造器,所有构造器必须显式的声明。构造器可以委托枚举中的其他构造器,但是构造过程仅当构造器将一个枚用例指定给`self`才全部完成。 +不像类或者结构体。枚举类型并不提供隐式的初始构造器,所有构造器必须显式的声明。构造器可以委托枚举中的其他构造器,但是构造过程仅当构造器将一个枚举用例指定给`self`才全部完成。 和结构体类似但是和类不同,枚举是值类型:枚举实例在赋予变量或常量时,或者被函数调用时被复制。 更多关于值类型的信息,参见结构体和枚举都是[值类型(Structures and Enumerations Are Value Types)](TODO)一节。 @@ -497,24 +497,24 @@ plusOne(10) 这种形式的枚举声明在其他语言中有时被叫做*可识别联合(discrinminated)*。 -这种形式中,每一个用例块由关键字`case`开始,后面紧接着一个或多个以逗号分隔的枚举用例。每一个用例名必须是独一无二的。每一个用例也可以指定它所存储的指定类型的值,这些类型在*关联值类型(associated values types)*的元组里被指定,立即书写在用例名后。 - -枚举用例也可以指定函数作为其存储的值,从而通过特定的关联值创建一个枚举实例。和真正的函数一样,你可以获取一个枚举用例的引用,然后在后续代码中调用它。 - -```swift -enum Number { - case Integer(Int) - case Real(Double) -} -let f = Number.Integer -// f is a function of type (Int) -> Number -// f 是一个传入 Int 返回 Number 类型的函数 - -// Apply f to create an array of Number instances with integer values -// 利用函数 f 把一个整数数组转成 Number 数组 -let evenInts: [Number] = [0, 2, 4, 6].map(f) -``` - +这种形式中,每一个用例块由关键字`case`开始,后面紧接着一个或多个以逗号分隔的枚举用例。每一个用例名必须是独一无二的。每一个用例也可以指定它所存储的指定类型的值,这些类型在*关联值类型(associated values types)*的元组里被指定,立即书写在用例名后。 + +枚举用例也可以指定函数作为其存储的值,从而通过特定的关联值创建一个枚举实例。和真正的函数一样,你可以获取一个枚举用例的引用,然后在后续代码中调用它。 + +```swift +enum Number { + case Integer(Int) + case Real(Double) +} +let f = Number.Integer +// f is a function of type (Int) -> Number +// f 是一个传入 Int 返回 Number 类型的函数 + +// Apply f to create an array of Number instances with integer values +// 利用函数 f 把一个整数数组转成 Number 数组 +let evenInts: [Number] = [0, 2, 4, 6].map(f) +``` + 获得更多关于关联值类型的信息和例子,请查看[关联值(Associated Values)](TODO)一节。 枚举有一个递归结构,就是说,枚举有着枚举类型自身实例的关联值的用例。然而,枚举类型的实例有值语义,意味着它们在内存中有着固定的位置。为了支持递归,编译器必需插入一个间接层。 @@ -1075,4 +1075,4 @@ Swift提供了三个级别的权限控制:`public`, `internal`, 和 `private` >访问级别修饰符 → **public­** | **public­(­set­)­** > >访问级别修饰符 → [访问级别修饰符(access-level-modeifier)](TODO) [访问级别修饰符列表(access-level-modeifiers)](TODO) _可选_ -­ \ No newline at end of file +­