From 905b986840818006d03fb8007b4a536947008226 Mon Sep 17 00:00:00 2001 From: yankuangshi Date: Sat, 7 Jun 2014 01:00:34 +0200 Subject: [PATCH 1/7] =?UTF-8?q?=E5=BC=80=E5=A7=8B=E7=BF=BB=E8=AF=91?= =?UTF-8?q?=E6=9E=9A=E4=B8=BE=E7=AB=A0=E8=8A=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- source/chapter2/08_Enumerations.md | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/source/chapter2/08_Enumerations.md b/source/chapter2/08_Enumerations.md index e69de29b..3fc5bb4f 100644 --- a/source/chapter2/08_Enumerations.md +++ b/source/chapter2/08_Enumerations.md @@ -0,0 +1,12 @@ +# 枚举 + +本页内容包含: + +- 枚举语法 +- 匹配枚举值与Swith语句 +- 实例值 +- 原始值 + +枚举定义了一个通用类型的一组相关的值,使您可以在您的代码中以类型安全的方式来使用这些值。 + +如果您熟悉C语言,那么您就会知道在C语言中枚举会把一些整型值赋予枚举标识符。Swift中的枚举更加灵活,不需要给每一个枚举成员提供一个值。如果一个值(一个“原始”值)被提供给一个枚举成员,那么这个值可以是一个字符串,一个字符,或是一个整型值或浮点值。 \ No newline at end of file From ad8bf18a8f1c6b2ff5d88f56d0541b8a1a8f8796 Mon Sep 17 00:00:00 2001 From: yankuangshi Date: Sat, 7 Jun 2014 18:43:15 +0200 Subject: [PATCH 2/7] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E6=9E=9A=E4=B8=BE?= =?UTF-8?q?=E8=AF=AD=E6=B3=95=E5=B0=8F=E8=8A=82=E7=9A=84=E7=BF=BB=E8=AF=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- source/chapter2/08_Enumerations.md | 50 ++++++++++++++++++++++++++++-- 1 file changed, 47 insertions(+), 3 deletions(-) diff --git a/source/chapter2/08_Enumerations.md b/source/chapter2/08_Enumerations.md index 3fc5bb4f..4f6a886d 100644 --- a/source/chapter2/08_Enumerations.md +++ b/source/chapter2/08_Enumerations.md @@ -3,10 +3,54 @@ 本页内容包含: - 枚举语法 -- 匹配枚举值与Swith语句 +- 匹配枚举值与`Swith`语句 - 实例值 - 原始值 -枚举定义了一个通用类型的一组相关的值,使您可以在您的代码中以类型安全的方式来使用这些值。 +枚举(enumeration)定义了一个通用类型的一组相关的值,使你可以在你的代码中以一个安全的方式来使用这些值。 -如果您熟悉C语言,那么您就会知道在C语言中枚举会把一些整型值赋予枚举标识符。Swift中的枚举更加灵活,不需要给每一个枚举成员提供一个值。如果一个值(一个“原始”值)被提供给一个枚举成员,那么这个值可以是一个字符串,一个字符,或是一个整型值或浮点值。 \ No newline at end of file +如果你熟悉C语言,你就会知道,在C语言中枚举会把一些整型值赋予枚举标识符。Swift中的枚举更加灵活,不需要给每一个枚举成员提供一个值。如果一个值(一个“原始”值)被提供给每个枚举成员(enumeration member),则该值可以是一个字符串,一个字符,或是一个整型值或浮点值。 + +此外,枚举成员可以指定任何类型的实例值(associated value)被每个枚举成 + +在Swift中,枚举类型是一等公民类型。它们采用了很多传统上只被类(class)所支持的特征,例如计算属性(computed properties),用于提供关于枚举当前值的附加信息, 实例方法(instance methods),用于提供和枚举所代表的值相关联的功能。枚举也可以定义实例初始化(initializers)来提供一个初始成员值;可以在原始的实现基础上扩展它们的功能;可以遵守协议(protocols)来提供标准的功能。 + +欲了解更多相关功能,请参见属性(Properties),方法(Methods),构造过程(Initialization),扩展(Extensions),和接口(Protocols)。 + +## 枚举语法 + +使用`enum`关键词并且把它们的整个定义放在一对大括号内: + + enum SomeEumeration { + // enumeration definition goes here + } + +以下是一个指南针四个方向的例子: + + enum CompassPoint { + case North + case South + case East + case West + } + +在一个枚举中定义的值(例如 `North`,`South`,`East`和`West`)是枚举的***成员值***(或者***成员***)。`case`关键词表明新的一行成员值将被定义。 + +> 注意: +> 不像C和Objective-C一样,Swift的枚举成员在被创建时不会被赋予一个默认的整数值。在上面的`CompassPoints`例子中,`North`,`South`,`East`和`West`不是隐示得等于`0`,`1`,`2`和`3`。相反的,这些不同的枚举成员在`CompassPoint`的一种显示定义中拥有各自不同的值。 + +多个成员值可以出现在同一行上,用逗号隔开: + + enum Planet { + case Mercury, Venus, Earth, Mars, Jupiter, Saturn, Uranus, Nepturn + } + +每个枚举定义了一个全新的类型。像Swift中其他类型一样,它们的名字(例如`CompassPoint`和`Planet`)必须以一个大写字母开头。给枚举类型单数名字而不是复数名字,以便于读起来更加容易理解: + + var directionToHead = CompassPoint.West + +`directionToHead`的类型被推断当它被`CompassPoint`的一个可能值初始化。一旦`directionToHead`被声明为一个`CompassPoint`,你可以使用更短的(.)语法将其设置为另一个`CompassPoint`的值: + + directionToHead = .East + +`directionToHead`的类型已知时,当设定它的值时,你可以不写类型名。使用显示类型的枚举值可以让代码具有更好的可读性。 \ No newline at end of file From 364bb30aaeb61a5dad90caf4b5f24c6056e66e15 Mon Sep 17 00:00:00 2001 From: yankuangshi Date: Sat, 7 Jun 2014 23:06:33 +0200 Subject: [PATCH 3/7] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E2=80=98=E5=8C=B9?= =?UTF-8?q?=E9=85=8D=E6=9E=9A=E4=B8=BE=E5=80=BC=E5=92=8CSwitch=E8=AF=AD?= =?UTF-8?q?=E5=8F=A5=E2=80=99=E5=B0=8F=E8=8A=82=E7=9A=84=E7=BF=BB=E8=AF=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- source/chapter2/08_Enumerations.md | 41 +++++++++++++++++++++++++++++- 1 file changed, 40 insertions(+), 1 deletion(-) diff --git a/source/chapter2/08_Enumerations.md b/source/chapter2/08_Enumerations.md index 4f6a886d..e2b7abb9 100644 --- a/source/chapter2/08_Enumerations.md +++ b/source/chapter2/08_Enumerations.md @@ -53,4 +53,43 @@ directionToHead = .East -`directionToHead`的类型已知时,当设定它的值时,你可以不写类型名。使用显示类型的枚举值可以让代码具有更好的可读性。 \ No newline at end of file +`directionToHead`的类型已知时,当设定它的值时,你可以不写类型名。使用显示类型的枚举值可以让代码具有更好的可读性。 + +## 匹配枚举值和`Switch`语句 + +你可以匹配单个枚举值和`switch`语句: + + directionToHead = .South + switch directionToHead { + case .North: + println("Lots of planets have a north") + case .South: + println("Watch out for penguins") + case .East: + println("Where the sun rises") + case .West: + println("Where the skies are blue") + } + // prints "Watch out for penguins” + +你可以如此这段代码: + +“考虑`directionToHead`的值。当它等于`.North`,打印`“Lots of planets have a north”`。当它等于`.South`,打印`“Watch out for penguins”`。” + +。。。。。。等等。 + +正如在控制流(Control Flow)中介绍,当考虑一个枚举的成员们时,一个`switch`语句必须全面。如果忽略了`.West`这种情况,上面那段代码将如果通过编译,因为它没有考虑到`CompassPoint`的全部成员。全面性的要求确保了枚举成员不会被意外遗漏。 + +当不需要匹配每个枚举成员的时候,你可以提供一个默认`default`分支来涵盖所有未明确提出的任何成员: + + let somePlanet = Planet.Earth + switch somePlanet { + case .Earth: + println("Mostly harmless") + default: + println("Not a safe place for humans") + } + // prints "Mostly harmless” + +## 实例值(associated values) + From 16623611386dd66a1f382e11b4009cc56d59d3fb Mon Sep 17 00:00:00 2001 From: yankuangshi Date: Sat, 7 Jun 2014 23:52:03 +0200 Subject: [PATCH 4/7] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E2=80=98=E5=AE=9E?= =?UTF-8?q?=E4=BE=8B=E5=80=BC=E2=80=99=E5=B0=8F=E8=8A=82=E7=9A=84=E9=83=A8?= =?UTF-8?q?=E5=88=86=E7=BF=BB=E8=AF=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- source/chapter2/08_Enumerations.md | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/source/chapter2/08_Enumerations.md b/source/chapter2/08_Enumerations.md index e2b7abb9..43dd509f 100644 --- a/source/chapter2/08_Enumerations.md +++ b/source/chapter2/08_Enumerations.md @@ -93,3 +93,13 @@ ## 实例值(associated values) +上一小节的例子演示了一个枚举的成员是如何被定义(分类)的。你可以为`Planet.Earth`设置一个常量或则变量,并且在之后查看这个值。然而,有时候会很有用如果能够把其他类型的实例值和成员值一起存储起来。这能让你随着成员值存储额外的自定义信息,并且当每次你在代码中利用该成员时允许这个信息产生变化。 + +你可以定义Swift的枚举存储任何类型的实例值,如果需要的话,每个成员的数据类型可以是各不相同的。枚举的这种特性跟其他语言中的可辨识联合(discriminated unions),标签联合(tagged unions),或者变体(variants)相似。 + +例如,假设一个库存跟踪系统需要利用两种不同类型的条形码来跟踪商品。有些商品上标有UPC-A格式的一维码,它使用数字0到9.每一个条形码都有一个代表“数字系统”的数字,该数字后接10个代表“标识符”的数字。最后一个数字是“检查”位,用来验证代码是否被正确扫描: + +其他商品上标有QR码格式的二维码,它可以使用任何ISO8859-1字符,并且可以编码一个最多拥有2,953字符的字符串。 + +对于库存跟踪系统来说,能够把UPC-A码作为三个整型值的元组,和把QR码作为一个任何长度的字符串存储起来是方便的。 + From 935db16b5cc40671228458b1beca8414cf2dd578 Mon Sep 17 00:00:00 2001 From: yankuangshi Date: Sun, 8 Jun 2014 00:58:57 +0200 Subject: [PATCH 5/7] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E2=80=98=E5=AE=9E?= =?UTF-8?q?=E4=BE=8B=E5=80=BC=E2=80=99=E5=B0=8F=E8=8A=82=E5=90=8E=E5=8D=8A?= =?UTF-8?q?=E9=83=A8=E5=88=86=E7=9A=84=E7=BF=BB=E8=AF=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- source/chapter2/08_Enumerations.md | 50 ++++++++++++++++++++++++++++-- 1 file changed, 48 insertions(+), 2 deletions(-) diff --git a/source/chapter2/08_Enumerations.md b/source/chapter2/08_Enumerations.md index 43dd509f..a8b19d56 100644 --- a/source/chapter2/08_Enumerations.md +++ b/source/chapter2/08_Enumerations.md @@ -72,7 +72,7 @@ } // prints "Watch out for penguins” -你可以如此这段代码: +你可以如此理解这段代码: “考虑`directionToHead`的值。当它等于`.North`,打印`“Lots of planets have a north”`。当它等于`.South`,打印`“Watch out for penguins”`。” @@ -91,7 +91,7 @@ } // prints "Mostly harmless” -## 实例值(associated values) +## 实例值(Associated Values) 上一小节的例子演示了一个枚举的成员是如何被定义(分类)的。你可以为`Planet.Earth`设置一个常量或则变量,并且在之后查看这个值。然而,有时候会很有用如果能够把其他类型的实例值和成员值一起存储起来。这能让你随着成员值存储额外的自定义信息,并且当每次你在代码中利用该成员时允许这个信息产生变化。 @@ -103,3 +103,49 @@ 对于库存跟踪系统来说,能够把UPC-A码作为三个整型值的元组,和把QR码作为一个任何长度的字符串存储起来是方便的。 +在Swift中,用来定义两种商品条码的枚举是这样子的: + + enum Barcode { + case UPCA(Int, Int, Int) + case QRCode(String) + } + +以上代码可以这么理解: + +“定义一个名为`Barcode`的枚举类型,它可以是`UPCA`的一个实例值(`Int`,`Int`,`Int`),或者`QRCode`的一个字符串类型(`String`)实例值。” + +这个定义不提供任何`Int`或`String`的实际值,它只是定义了,当`Barcode`常量和变量等于`Barcode.UPCA`或`Barcode.QRCode`时,其实例值的类型。 + +然后可以使用任何一种类型类创建新的条码,如: + + var productBarcode = Barcode.UPCA(8, 85909_51226, 3) + +以上例子创建了一个名为`productBarcode`的新变量,并且赋给它一个`Barcode.UPCA`的实例元组值`(8, 8590951226, 3)`。提供的“标识符”值在整数字中有一个下划线,使其便于阅读条形码。 + +同一个商品可以被分配一个不同类型的条形码,如: + + productBarcode = .QRCode("ABCDEFGHIJKLMNOP") + +这时,原始的`Barcode.UPCA`和其整数值被新的`Barcode.QRCode`和其字符串值所替代。条形码的常量和变量可以存储一个`.UPCA`或者一个`.QRCode`(连同其实例值),但是在任何指定时间只能存储其中之一。 + +像以前那样,不同的条形码类型可以使用一个switch语句来检查,然而这次实例值可以被提取作为switch语句的一部分。你可以在`switch`的case分支代码中,提取每个实例值作为一个常量(用`let`前缀)或者作为一个变量(用`var`前缀)来使用: + + switch productBarcode { + case .UPCA(let numberSystem, let identifier, let check): + println("UPC-A with value of \(numberSystem), \(identifier), \(check).") + case .QRCode(let productCode): + println("QR code with value of \(productCode).") + } + // prints "QR code with value of ABCDEFGHIJKLMNOP.” + +如果一个枚举成员的所有实例值被提取为常量,或者它们全部被提取为变量,为了简洁,你可以只放置一个`var`或者`let`标注在成员名称前: + + switch productBarcode { + case let .UPCA(numberSystem, identifier, check): + println("UPC-A with value of \(numberSystem), \(identifier), \(check).") + case let .QRCode(productCode): + println("QR code with value of \(productCode).") + } + // prints "QR code with value of ABCDEFGHIJKLMNOP." + +## 原始值(Raw Values) \ No newline at end of file From 356bff4fabd2edaeab967e653a78909e8f20aa98 Mon Sep 17 00:00:00 2001 From: yankuangshi Date: Sun, 8 Jun 2014 14:53:41 +0200 Subject: [PATCH 6/7] add raw values part translation --- source/chapter2/08_Enumerations.md | 63 ++++++++++++++++++++++++++++-- 1 file changed, 60 insertions(+), 3 deletions(-) diff --git a/source/chapter2/08_Enumerations.md b/source/chapter2/08_Enumerations.md index a8b19d56..297111f0 100644 --- a/source/chapter2/08_Enumerations.md +++ b/source/chapter2/08_Enumerations.md @@ -11,7 +11,7 @@ 如果你熟悉C语言,你就会知道,在C语言中枚举会把一些整型值赋予枚举标识符。Swift中的枚举更加灵活,不需要给每一个枚举成员提供一个值。如果一个值(一个“原始”值)被提供给每个枚举成员(enumeration member),则该值可以是一个字符串,一个字符,或是一个整型值或浮点值。 -此外,枚举成员可以指定任何类型的实例值(associated value)被每个枚举成 +此外,枚举成员可以指定任何类型的实例值(associated value)存储到枚举成员值中,就像其他语言中的联合体(unions)和变体(variants)。你可以定义一组通用的相关成员作为一个枚举的一部分,每一组都有不同的一组与它相关的适当类型的数值。 在Swift中,枚举类型是一等公民类型。它们采用了很多传统上只被类(class)所支持的特征,例如计算属性(computed properties),用于提供关于枚举当前值的附加信息, 实例方法(instance methods),用于提供和枚举所代表的值相关联的功能。枚举也可以定义实例初始化(initializers)来提供一个初始成员值;可以在原始的实现基础上扩展它们的功能;可以遵守协议(protocols)来提供标准的功能。 @@ -99,7 +99,11 @@ 例如,假设一个库存跟踪系统需要利用两种不同类型的条形码来跟踪商品。有些商品上标有UPC-A格式的一维码,它使用数字0到9.每一个条形码都有一个代表“数字系统”的数字,该数字后接10个代表“标识符”的数字。最后一个数字是“检查”位,用来验证代码是否被正确扫描: -其他商品上标有QR码格式的二维码,它可以使用任何ISO8859-1字符,并且可以编码一个最多拥有2,953字符的字符串。 + + +其他商品上标有QR码格式的二维码,它可以使用任何ISO8859-1字符,并且可以编码一个最多拥有2,953字符的字符串: + + 对于库存跟踪系统来说,能够把UPC-A码作为三个整型值的元组,和把QR码作为一个任何长度的字符串存储起来是方便的。 @@ -148,4 +152,57 @@ } // prints "QR code with value of ABCDEFGHIJKLMNOP." -## 原始值(Raw Values) \ No newline at end of file +## 原始值(Raw Values) + +在实例值(Associated Values)小节的条形码例子演示了一个枚举的成员如何声明它们存储不同类型的实例值。作为实例值的替代,枚举成员可以被默认值(称为原始值)预先填充,其中这些原始值具有相同的类型。 + +这里是一个枚举成员存储原始ASCII值的例子: + + enum ASCIIControlCharacter: Character { + case Tab = "\t" + case LineFeed = "\n" + case CarriageReturn = "\r" + } + +在这里,称为`ASCIIControlCharacter`的枚举的原始值类型被定义为字符型`Character`,并被设置了一些比较常见的ASCII控制字符。字符值的描述请详见`Strings and Characters`部分。 + +注意,原始值和实例值是不相同的。当你开始在你的代码中定义枚举的时候原始值是被预先填充的值,像上述三个ASCII码。对于一个特定的枚举成员,它的原始值始终是相同的。实例值是当你在创建一个基于枚举成员的新常量或变量时才会被设置,并且每次当你这么做得时候,它的值可以是不同的。 + +原始值可以是字符串,字符,或者任何整型值或浮点型值。每个原始值在它的枚举声明中必须是唯一的。当整型值被用于原始值,如果其他枚举成员没有值时,它们会自动递增。 + +下面的枚举是对之前`Planet`这个枚举的一个细化,利用原始整型值来表示每个planet在太阳系中的顺序: + + enum Planet: Int { + case Mercury = 1, Venus, Earth, Mars, Jupiter, Saturn, Uranus, Neptune + } + +自动递增意味着`Planet.Venus`的原始值是`2`,依次类推。 + +使用枚举成员的`toRaw`方法可以访问该枚举成员的原始值: + + let earthsOrder = Planet.Earth.toRaw() + // earthsOrder is 3 + +使用枚举的`fromRaw`方法来试图找到具有特定原始值的枚举成员。这个例子通过原始值`7`识别`Uranus`: + + let possiblePlanet = Planet.fromRaw(7) + // possiblePlanet is of type Planet? and equals Planet.Uranus + +然后,并非所有可能的`Int`值都可以找到一个匹配的行星。正因为如此,`fromRaw`方法可以返回一个***可选***的枚举成员。在上面的例子中,`possiblePlanet`是`Planet?`类型,或“可选的`Planet`”。 + +如果你试图寻找一个位置为9的行星,通过`fromRaw`返回的可选`Planet`值将是`nil`: + + let positionToFind = 9 + if let somePlanet = Planet.fromRaw(positionToFind) { + switch somePlanet { + case .Earth: + println("Mostly harmless") + default: + println("Not a safe place for humans") + } + } else { + println("There isn't a planet at position \(positionToFind)") + } + // prints "There isn't a planet at position 9 + +这个范例使用可选绑定(optional binding),通过原始值`9`试图访问一个行星。通过`if let somePlanet = Planet.fromRaw(9)`语句获得一个可选`Planet`,如果可选`Planet`可以被获得,把`somePlanet`设置成该可选`Planet`的内容。在这个范例中,无法检索到位置为`9`的行星,所以`else`分支被执行。 \ No newline at end of file From 2d707ef9ac4ab9e32e4d1061d947f8e3df5f9969 Mon Sep 17 00:00:00 2001 From: yankuangshi Date: Sun, 8 Jun 2014 16:03:34 +0200 Subject: [PATCH 7/7] refine: Enumerations --- source/chapter2/08_Enumerations.md | 48 +++++++++++++++--------------- 1 file changed, 24 insertions(+), 24 deletions(-) diff --git a/source/chapter2/08_Enumerations.md b/source/chapter2/08_Enumerations.md index 297111f0..7f0c19d8 100644 --- a/source/chapter2/08_Enumerations.md +++ b/source/chapter2/08_Enumerations.md @@ -4,18 +4,18 @@ - 枚举语法 - 匹配枚举值与`Swith`语句 -- 实例值 -- 原始值 +- 实例值(associated values) +- 原始值(raw values) 枚举(enumeration)定义了一个通用类型的一组相关的值,使你可以在你的代码中以一个安全的方式来使用这些值。 -如果你熟悉C语言,你就会知道,在C语言中枚举会把一些整型值赋予枚举标识符。Swift中的枚举更加灵活,不需要给每一个枚举成员提供一个值。如果一个值(一个“原始”值)被提供给每个枚举成员(enumeration member),则该值可以是一个字符串,一个字符,或是一个整型值或浮点值。 +如果你熟悉C语言,你就会知道,在C语言中枚举指定相关名称为一组整型值。Swift中的枚举更加灵活,不必给每一个枚举成员(enumeration member)提供一个值。如果一个值(被认为是“原始”值)被提供给每个枚举成员,则该值可以是一个字符串,一个字符,或是一个整型值或浮点值。 -此外,枚举成员可以指定任何类型的实例值(associated value)存储到枚举成员值中,就像其他语言中的联合体(unions)和变体(variants)。你可以定义一组通用的相关成员作为一个枚举的一部分,每一组都有不同的一组与它相关的适当类型的数值。 +此外,枚举成员可以指定任何类型的实例值存储到枚举成员值中,就像其他语言中的联合体(unions)和变体(variants)。你可以定义一组通用的相关成员作为枚举的一部分,每一组都有不同的一组与它相关的适当类型的数值。 -在Swift中,枚举类型是一等公民类型。它们采用了很多传统上只被类(class)所支持的特征,例如计算属性(computed properties),用于提供关于枚举当前值的附加信息, 实例方法(instance methods),用于提供和枚举所代表的值相关联的功能。枚举也可以定义实例初始化(initializers)来提供一个初始成员值;可以在原始的实现基础上扩展它们的功能;可以遵守协议(protocols)来提供标准的功能。 +在Swift中,枚举类型是一等(first-class)类型。它们采用了很多传统上只被类(class)所支持的特征,例如计算型属性(computed properties),用于提供关于枚举当前值的附加信息, 实例方法(instance methods),用于提供和枚举所代表的值相关联的功能。枚举也可以定义构造函数(initializers)来提供一个初始成员值;可以在原始的实现基础上扩展它们的功能;可以遵守协议(protocols)来提供标准的功能。 -欲了解更多相关功能,请参见属性(Properties),方法(Methods),构造过程(Initialization),扩展(Extensions),和接口(Protocols)。 +欲了解更多相关功能,请参见属性(Properties),方法(Methods),构造过程(Initialization),扩展(Extensions),和协议(Protocols)。 ## 枚举语法 @@ -25,7 +25,7 @@ // enumeration definition goes here } -以下是一个指南针四个方向的例子: +以下是指南针四个方向的一个例子: enum CompassPoint { case North @@ -34,10 +34,10 @@ case West } -在一个枚举中定义的值(例如 `North`,`South`,`East`和`West`)是枚举的***成员值***(或者***成员***)。`case`关键词表明新的一行成员值将被定义。 +一个枚举中被定义的值(例如 `North`,`South`,`East`和`West`)是枚举的***成员值***(或者***成员***)。`case`关键词表明新的一行成员值将被定义。 > 注意: -> 不像C和Objective-C一样,Swift的枚举成员在被创建时不会被赋予一个默认的整数值。在上面的`CompassPoints`例子中,`North`,`South`,`East`和`West`不是隐示得等于`0`,`1`,`2`和`3`。相反的,这些不同的枚举成员在`CompassPoint`的一种显示定义中拥有各自不同的值。 +> 不像C和Objective-C一样,Swift的枚举成员在被创建时不会被赋予一个默认的整数值。在上面的`CompassPoints`例子中,`North`,`South`,`East`和`West`不是隐式得等于`0`,`1`,`2`和`3`。相反的,这些不同的枚举成员在`CompassPoint`的一种显示定义中拥有各自不同的值。 多个成员值可以出现在同一行上,用逗号隔开: @@ -45,15 +45,15 @@ case Mercury, Venus, Earth, Mars, Jupiter, Saturn, Uranus, Nepturn } -每个枚举定义了一个全新的类型。像Swift中其他类型一样,它们的名字(例如`CompassPoint`和`Planet`)必须以一个大写字母开头。给枚举类型单数名字而不是复数名字,以便于读起来更加容易理解: +每个枚举定义了一个全新的类型。像Swift中其他类型一样,它们的名字(例如`CompassPoint`和`Planet`)必须以一个大写字母开头。给枚举类型起一个单数名字而不是复数名字,以便于读起来更加容易理解: var directionToHead = CompassPoint.West -`directionToHead`的类型被推断当它被`CompassPoint`的一个可能值初始化。一旦`directionToHead`被声明为一个`CompassPoint`,你可以使用更短的(.)语法将其设置为另一个`CompassPoint`的值: +`directionToHead`的类型被推断当它被`CompassPoint`的一个可能值初始化。一旦`directionToHead`被声明为一个`CompassPoint`,你可以使用更短的点(.)语法将其设置为另一个`CompassPoint`的值: directionToHead = .East -`directionToHead`的类型已知时,当设定它的值时,你可以不写类型名。使用显示类型的枚举值可以让代码具有更好的可读性。 +`directionToHead`的类型已知时,当设定它的值时,你可以不再写类型名。使用显示类型的枚举值可以让代码具有更好的可读性。 ## 匹配枚举值和`Switch`语句 @@ -76,11 +76,11 @@ “考虑`directionToHead`的值。当它等于`.North`,打印`“Lots of planets have a north”`。当它等于`.South`,打印`“Watch out for penguins”`。” -。。。。。。等等。 +等等依次类推。 -正如在控制流(Control Flow)中介绍,当考虑一个枚举的成员们时,一个`switch`语句必须全面。如果忽略了`.West`这种情况,上面那段代码将如果通过编译,因为它没有考虑到`CompassPoint`的全部成员。全面性的要求确保了枚举成员不会被意外遗漏。 +正如在控制流(Control Flow)中介绍,当考虑一个枚举的成员们时,一个`switch`语句必须全面。如果忽略了`.West`这种情况,上面那段代码将无法通过编译,因为它没有考虑到`CompassPoint`的全部成员。全面性的要求确保了枚举成员不会被意外遗漏。 -当不需要匹配每个枚举成员的时候,你可以提供一个默认`default`分支来涵盖所有未明确提出的任何成员: +当不需要匹配每个枚举成员的时候,你可以提供一个默认`default`分支来涵盖所有未明确被提出的任何成员: let somePlanet = Planet.Earth switch somePlanet { @@ -118,21 +118,21 @@ “定义一个名为`Barcode`的枚举类型,它可以是`UPCA`的一个实例值(`Int`,`Int`,`Int`),或者`QRCode`的一个字符串类型(`String`)实例值。” -这个定义不提供任何`Int`或`String`的实际值,它只是定义了,当`Barcode`常量和变量等于`Barcode.UPCA`或`Barcode.QRCode`时,其实例值的类型。 +这个定义不提供任何`Int`或`String`的实际值,它只是定义了,当`Barcode`常量和变量等于`Barcode.UPCA`或`Barcode.QRCode`时,实例值的类型。 -然后可以使用任何一种类型类创建新的条码,如: +然后可以使用任何一种条码类型创建新的条码,如: var productBarcode = Barcode.UPCA(8, 85909_51226, 3) 以上例子创建了一个名为`productBarcode`的新变量,并且赋给它一个`Barcode.UPCA`的实例元组值`(8, 8590951226, 3)`。提供的“标识符”值在整数字中有一个下划线,使其便于阅读条形码。 -同一个商品可以被分配一个不同类型的条形码,如: +同一个商品可以被分配给一个不同类型的条形码,如: productBarcode = .QRCode("ABCDEFGHIJKLMNOP") -这时,原始的`Barcode.UPCA`和其整数值被新的`Barcode.QRCode`和其字符串值所替代。条形码的常量和变量可以存储一个`.UPCA`或者一个`.QRCode`(连同其实例值),但是在任何指定时间只能存储其中之一。 +这时,原始的`Barcode.UPCA`和其整数值被新的`Barcode.QRCode`和其字符串值所替代。条形码的常量和变量可以存储一个`.UPCA`或者一个`.QRCode`(连同它的实例值),但是在任何指定时间只能存储其中之一。 -像以前那样,不同的条形码类型可以使用一个switch语句来检查,然而这次实例值可以被提取作为switch语句的一部分。你可以在`switch`的case分支代码中,提取每个实例值作为一个常量(用`let`前缀)或者作为一个变量(用`var`前缀)来使用: +像以前那样,不同的条形码类型可以使用一个switch语句来检查,然而这次实例值可以被提取作为switch语句的一部分。你可以在`switch`的case分支代码中提取每个实例值作为一个常量(用`let`前缀)或者作为一个变量(用`var`前缀)来使用: switch productBarcode { case .UPCA(let numberSystem, let identifier, let check): @@ -154,7 +154,7 @@ ## 原始值(Raw Values) -在实例值(Associated Values)小节的条形码例子演示了一个枚举的成员如何声明它们存储不同类型的实例值。作为实例值的替代,枚举成员可以被默认值(称为原始值)预先填充,其中这些原始值具有相同的类型。 +在实例值小节的条形码例子中演示了一个枚举的成员如何声明它们存储不同类型的实例值。作为实例值的替代,枚举成员可以被默认值(称为原始值)预先填充,其中这些原始值具有相同的类型。 这里是一个枚举成员存储原始ASCII值的例子: @@ -164,7 +164,7 @@ case CarriageReturn = "\r" } -在这里,称为`ASCIIControlCharacter`的枚举的原始值类型被定义为字符型`Character`,并被设置了一些比较常见的ASCII控制字符。字符值的描述请详见`Strings and Characters`部分。 +在这里,称为`ASCIIControlCharacter`的枚举的原始值类型被定义为字符型`Character`,并被设置了一些比较常见的ASCII控制字符。字符值的描述请详见字符串和字符`Strings and Characters`部分。 注意,原始值和实例值是不相同的。当你开始在你的代码中定义枚举的时候原始值是被预先填充的值,像上述三个ASCII码。对于一个特定的枚举成员,它的原始值始终是相同的。实例值是当你在创建一个基于枚举成员的新常量或变量时才会被设置,并且每次当你这么做得时候,它的值可以是不同的。 @@ -188,7 +188,7 @@ let possiblePlanet = Planet.fromRaw(7) // possiblePlanet is of type Planet? and equals Planet.Uranus -然后,并非所有可能的`Int`值都可以找到一个匹配的行星。正因为如此,`fromRaw`方法可以返回一个***可选***的枚举成员。在上面的例子中,`possiblePlanet`是`Planet?`类型,或“可选的`Planet`”。 +然而,并非所有可能的`Int`值都可以找到一个匹配的行星。正因为如此,`fromRaw`方法可以返回一个***可选***的枚举成员。在上面的例子中,`possiblePlanet`是`Planet?`类型,或“可选的`Planet`”。 如果你试图寻找一个位置为9的行星,通过`fromRaw`返回的可选`Planet`值将是`nil`: @@ -205,4 +205,4 @@ } // prints "There isn't a planet at position 9 -这个范例使用可选绑定(optional binding),通过原始值`9`试图访问一个行星。通过`if let somePlanet = Planet.fromRaw(9)`语句获得一个可选`Planet`,如果可选`Planet`可以被获得,把`somePlanet`设置成该可选`Planet`的内容。在这个范例中,无法检索到位置为`9`的行星,所以`else`分支被执行。 \ No newline at end of file +这个范例使用可选绑定(optional binding),通过原始值`9`试图访问一个行星。`if let somePlanet = Planet.fromRaw(9)`语句获得一个可选`Planet`,如果可选`Planet`可以被获得,把`somePlanet`设置成该可选`Planet`的内容。在这个范例中,无法检索到位置为`9`的行星,所以`else`分支被执行。 \ No newline at end of file