Merge pull request #242 from TheLittleBoy/patch-6

翻译保持一致
This commit is contained in:
ChildhoodAndy
2014-07-06 14:28:00 +08:00

View File

@ -10,11 +10,11 @@
- [为可选链定义模型类](#defining_model_classes_for_optional_chaining) - [为可选链定义模型类](#defining_model_classes_for_optional_chaining)
- [通过可选链调用属性](#calling_properties_through_optional_chaining) - [通过可选链调用属性](#calling_properties_through_optional_chaining)
- [通过可选链调用方法](#calling_methods_through_optional_chaining) - [通过可选链调用方法](#calling_methods_through_optional_chaining)
- [使用可选链调用脚本](#calling_subscripts_through_optional_chaining) - [使用可选链调用下标脚本](#calling_subscripts_through_optional_chaining)
- [连接多层链接](#linking_multiple_levels_of_chaining) - [连接多层链接](#linking_multiple_levels_of_chaining)
- [链接可选返回值的方法](#chaining_on_methods_with_optional_return_values) - [链接可选返回值的方法](#chaining_on_methods_with_optional_return_values)
可选链Optional Chaining是一种可以请求和调用属性、方法及脚本的过程,它的可选性体现于请求或调用的目标当前可能为空(`nil`)。如果可选的目标有值,那么调用就会成功;相反,如果选择的目标为空(`nil`),则这种调用将返回空(`nil`)。多次请求或调用可以被链接在一起形成一个链,如果任何一个节点为空(`nil`)将导致整个链失效。 可选链Optional Chaining是一种可以请求和调用属性、方法及下标脚本的过程,它的可选性体现于请求或调用的目标当前可能为空(`nil`)。如果可选的目标有值,那么调用就会成功;相反,如果选择的目标为空(`nil`),则这种调用将返回空(`nil`)。多次请求或调用可以被链接在一起形成一个链,如果任何一个节点为空(`nil`)将导致整个链失效。
> 注意: > 注意:
Swift 的可选链和 Objective-C 中的消息为空有些相像,但是 Swift 可以使用在任意类型中,并且失败与否可以被检测到。 Swift 的可选链和 Objective-C 中的消息为空有些相像,但是 Swift 可以使用在任意类型中,并且失败与否可以被检测到。
@ -22,9 +22,9 @@ Swift 的可选链和 Objective-C 中的消息为空有些相像,但是 Swift
<a name="optional_chaining_as_an_alternative_to_forced_unwrapping"></a> <a name="optional_chaining_as_an_alternative_to_forced_unwrapping"></a>
## 可选链可替代强制解析 ## 可选链可替代强制解析
通过在想调用的属性、方法、或脚本的可选值(`optional value`)(非空)后面放一个问号,可以定义一个可选链。这一点很像在可选值后面放一个叹号来强制拆得其封包内的值。它们的主要的区别在于当可选值为空时可选链即刻失败,然而一般的强制解析将会引发运行时错误。 通过在想调用的属性、方法、或下标脚本的可选值(`optional value`)(非空)后面放一个问号,可以定义一个可选链。这一点很像在可选值后面放一个叹号来强制拆得其封包内的值。它们的主要的区别在于当可选值为空时可选链即刻失败,然而一般的强制解析将会引发运行时错误。
为了反映可选链可以调用空(`nil`),不论你调用的属性、方法、脚本等返回的值是不是可选值它的返回结果都是一个可选值。你可以利用这个返回值来检测你的可选链是否调用成功有返回值即成功返回nil则失败。 为了反映可选链可以调用空(`nil`),不论你调用的属性、方法、下标脚本等返回的值是不是可选值它的返回结果都是一个可选值。你可以利用这个返回值来检测你的可选链是否调用成功有返回值即成功返回nil则失败。
调用可选链的返回结果与原本的返回结果具有相同的类型,但是原本的返回结果被包装成了一个可选值,当可选链调用成功时,一个应该返回`Int`的属性将会返回`Int?` 调用可选链的返回结果与原本的返回结果具有相同的类型,但是原本的返回结果被包装成了一个可选值,当可选链调用成功时,一个应该返回`Int`的属性将会返回`Int?`
@ -95,7 +95,7 @@ if let roomCount = john.residence?.numberOfRooms {
<a name="defining_model_classes_for_optional_chaining"></a> <a name="defining_model_classes_for_optional_chaining"></a>
##为可选链定义模型类 ##为可选链定义模型类
你可以使用可选链来多层调用属性,方法,和脚本。这让你可以利用它们之间的复杂模型来获取更底层的属性,并检查是否可以成功获取此类底层属性。 你可以使用可选链来多层调用属性,方法,和下标脚本。这让你可以利用它们之间的复杂模型来获取更底层的属性,并检查是否可以成功获取此类底层属性。
后面的代码定义了四个将在后面使用的模型类,其中包括多层可选链。这些类是由上面的`Person``Residence`模型通过添加一个`Room`和一个`Address`类拓展来。 后面的代码定义了四个将在后面使用的模型类,其中包括多层可选链。这些类是由上面的`Person``Residence`模型通过添加一个`Room`和一个`Address`类拓展来。
@ -127,7 +127,7 @@ class Residence {
因为`Residence`存储了一个`Room`实例的数组,它的`numberOfRooms`属性值不是一个固定的存储值,而是通过计算而来的。`numberOfRooms`属性值是由返回`rooms`数组的`count`属性值得到的。 因为`Residence`存储了一个`Room`实例的数组,它的`numberOfRooms`属性值不是一个固定的存储值,而是通过计算而来的。`numberOfRooms`属性值是由返回`rooms`数组的`count`属性值得到的。
为了能快速访问`rooms`数组,`Residence`定义了一个只读的脚本,通过插入数组的元素角标就可以成功调用。如果该角标存在,脚本则将该元素返回。 为了能快速访问`rooms`数组,`Residence`定义了一个只读的下标脚本,通过插入数组的元素角标就可以成功调用。如果该角标存在,下标脚本则将该元素返回。
`Residence`中也提供了一个`printNumberOfRooms`的方法,即简单的打印房间个数。 `Residence`中也提供了一个`printNumberOfRooms`的方法,即简单的打印房间个数。
@ -209,14 +209,14 @@ if john.residence?.printNumberOfRooms() {
``` ```
<a name="calling_subscripts_through_optional_chaining"></a> <a name="calling_subscripts_through_optional_chaining"></a>
##使用可选链调用脚本 ##使用可选链调用下标脚本
你可以使用可选链来尝试从脚本获取值并检查脚本的调用是否成功,然而,你不能通过可选链来设置子代码。 你可以使用可选链来尝试从下标脚本获取值并检查下标脚本的调用是否成功,然而,你不能通过可选链来设置子代码。
> 注意: > 注意:
当你使用可选链来获取脚本的时候,你应该将问号放在脚本括号的前面而不是后面。可选链的问号一般直接跟在表达语句的后面。 当你使用可选链来获取下标脚本的时候,你应该将问号放在下标脚本括号的前面而不是后面。可选链的问号一般直接跟在表达语句的后面。
下面这个例子用在`Residence`类中定义的脚本来获取`john.residence`数组中第一个房间的名字。因为`john.residence`现在是`nil`脚本的调用失败了。 下面这个例子用在`Residence`类中定义的下标脚本来获取`john.residence`数组中第一个房间的名字。因为`john.residence`现在是`nil`下标脚本的调用失败了。
```swift ```swift
if let firstRoomName = john.residence?[0].name { if let firstRoomName = john.residence?[0].name {
@ -227,9 +227,9 @@ if let firstRoomName = john.residence?[0].name {
// 打印 "Unable to retrieve the first room name."。 // 打印 "Unable to retrieve the first room name."。
``` ```
在子代码调用中可选链的问号直接跟在`john.residence`的后面,在脚本括号的前面,因为`john.residence`是可选链试图获得的可选值。 在子代码调用中可选链的问号直接跟在`john.residence`的后面,在下标脚本括号的前面,因为`john.residence`是可选链试图获得的可选值。
如果你创建一个`Residence`实例给`john.residence`,且在他的`rooms`数组中有一个或多个`Room`实例,那么你可以使用可选链通过`Residence`脚本来获取在`rooms`数组中的实例了: 如果你创建一个`Residence`实例给`john.residence`,且在他的`rooms`数组中有一个或多个`Room`实例,那么你可以使用可选链通过`Residence`下标脚本来获取在`rooms`数组中的实例了:
```swift ```swift
let johnsHouse = Residence() let johnsHouse = Residence()