纠错,更改一些正式版本的变更

This commit is contained in:
Kevin Jiang
2014-09-27 19:27:33 +08:00
parent 67d7698001
commit 94b6c46c54
5 changed files with 10 additions and 10 deletions

View File

@ -284,6 +284,6 @@ Swift 中`数组Array`和`字典Dictionary`类型均以结构体的
以下对`数组`和`结构体`的行为描述与对`NSArray`和`NSDictionary`的行为描述在本质上不同,后者是以类的形式实现,前者是以结构体的形式实现。`NSArray`和`NSDictionary`实例总是以对已有实例引用,而不是拷贝的方式被赋值和传递。 以下对`数组`和`结构体`的行为描述与对`NSArray`和`NSDictionary`的行为描述在本质上不同,后者是以类的形式实现,前者是以结构体的形式实现。`NSArray`和`NSDictionary`实例总是以对已有实例引用,而不是拷贝的方式被赋值和传递。
> 注意: > 注意:
是对于数组,字典,字符串和其它值的`拷贝`的描述。 是对于数组,字典,字符串和其它值的`拷贝`的描述。
在你的代码中,拷贝好像是确实是在有拷贝行为的地方产生过。然而,在 Swift 的后台中,只有确有必要,`实际actual`拷贝才会被执行。Swift 管理所有的值拷贝以确保性能最优化的性能,所以你也没有必要去避免赋值以保证最优性能。(实际赋值由系统管理优化) 在你的代码中,拷贝好像是确实是在有拷贝行为的地方产生过。然而,在 Swift 的后台中,只有确有必要,`实际actual`拷贝才会被执行。Swift 管理所有的值拷贝以确保性能最优化的性能,所以你也没有必要去避免赋值以保证最优性能。(实际赋值由系统管理优化)

View File

@ -513,7 +513,7 @@ class RecipeIngredient: Food {
self.quantity = quantity self.quantity = quantity
super.init(name: name) super.init(name: name)
} }
convenience init(name: String) { override convenience init(name: String) {
self.init(name: name, quantity: 1) self.init(name: name, quantity: 1)
} }
} }
@ -527,7 +527,7 @@ class RecipeIngredient: Food {
`RecipeIngredient`也定义了一个便利构造器`init(name: String)`,它只通过`name`来创建`RecipeIngredient`的实例。这个便利构造器假设任意`RecipeIngredient`实例的`quantity`为1所以不需要显示指明数量即可创建出实例。这个便利构造器的定义可以让创建实例更加方便和快捷并且避免了使用重复的代码来创建多个`quantity`为 1 的`RecipeIngredient`实例。这个便利构造器只是简单的将任务代理给了同一类里提供的指定构造器。 `RecipeIngredient`也定义了一个便利构造器`init(name: String)`,它只通过`name`来创建`RecipeIngredient`的实例。这个便利构造器假设任意`RecipeIngredient`实例的`quantity`为1所以不需要显示指明数量即可创建出实例。这个便利构造器的定义可以让创建实例更加方便和快捷并且避免了使用重复的代码来创建多个`quantity`为 1 的`RecipeIngredient`实例。这个便利构造器只是简单的将任务代理给了同一类里提供的指定构造器。
注意,`RecipeIngredient`的便利构造器`init(name: String)`使用了跟`Food`中指定构造器`init(name: String)`相同的参数。尽管`RecipeIngredient`这个构造器是便利构造器`RecipeIngredient`依然提供了对所有父类指定构造器的实现。因此,`RecipeIngredient`也能自动继承了所有父类的便利构造器 注意,`RecipeIngredient`的便利构造器`init(name: String)`使用了跟`Food`中指定构造器`init(name: String)`相同的参数。因为这个便利构造器重写要父类的指定构造器`init(name: String)`,必须在前面使用使用`override`标识
在这个例子中,`RecipeIngredient`的父类是`Food`,它有一个便利构造器`init()`。这个构造器因此也被`RecipeIngredient`继承。这个继承的`init()`函数版本跟`Food`提供的版本是一样的,除了它是将任务代理给`RecipeIngredient`版本的`init(name: String)`而不是`Food`提供的版本。 在这个例子中,`RecipeIngredient`的父类是`Food`,它有一个便利构造器`init()`。这个构造器因此也被`RecipeIngredient`继承。这个继承的`init()`函数版本跟`Food`提供的版本是一样的,除了它是将任务代理给`RecipeIngredient`版本的`init(name: String)`而不是`Food`提供的版本。

View File

@ -403,7 +403,7 @@ class HTMLElement {
let name: String let name: String
let text: String? let text: String?
@lazy var asHTML: () -> String = { lazy var asHTML: () -> String = {
if let text = self.text { if let text = self.text {
return "<\(self.name)>\(text)</\(self.name)>" return "<\(self.name)>\(text)</\(self.name)>"
} else { } else {
@ -479,7 +479,7 @@ Swift 有如下要求:只要在闭包内使用`self`的成员,就要用`self
捕获列表放置在闭包参数列表和返回类型之前: 捕获列表放置在闭包参数列表和返回类型之前:
```swift ```swift
@lazy var someClosure: (Int, String) -> String = { lazy var someClosure: (Int, String) -> String = {
[unowned self] (index: Int, stringToProcess: String) -> String in [unowned self] (index: Int, stringToProcess: String) -> String in
// closure body goes here // closure body goes here
} }
@ -488,7 +488,7 @@ Swift 有如下要求:只要在闭包内使用`self`的成员,就要用`self
如果闭包没有指定参数列表或者返回类型,则可以通过上下文推断,那么可以捕获列表放在闭包开始的地方,跟着是关键字`in` 如果闭包没有指定参数列表或者返回类型,则可以通过上下文推断,那么可以捕获列表放在闭包开始的地方,跟着是关键字`in`
```swift ```swift
@lazy var someClosure: () -> String = { lazy var someClosure: () -> String = {
[unowned self] in [unowned self] in
// closure body goes here // closure body goes here
} }
@ -511,7 +511,7 @@ class HTMLElement {
let name: String let name: String
let text: String? let text: String?
@lazy var asHTML: () -> String = { lazy var asHTML: () -> String = {
[unowned self] in [unowned self] in
if let text = self.text { if let text = self.text {
return "<\(self.name)>\(text)</\(self.name)>" return "<\(self.name)>\(text)</\(self.name)>"

View File

@ -71,7 +71,7 @@ if let roomCount = john.residence?.numberOfRooms {
这告诉 Swift 来链接可选`residence?`属性,如果`residence`存在则取回`numberOfRooms`的值。 这告诉 Swift 来链接可选`residence?`属性,如果`residence`存在则取回`numberOfRooms`的值。
因为这种尝试获得`numberOfRooms`的操作有可能失败,可选链会返回`Int?`类型值,或者称作“可选`Int`”。当`residence`是空的时候(上例),选择`Int`将会为空,因此会出无法访问`numberOfRooms`的情况。 因为这种尝试获得`numberOfRooms`的操作有可能失败,可选链会返回`Int?`类型值,或者称作“可选`Int`”。当`residence`是空的时候(上例),选择`Int`将会为空,因此会出无法访问`numberOfRooms`的情况。
要注意的是即使numberOfRooms是非可选`Int``Int?`)时这一点也成立。只要是通过可选链的请求就意味着最后`numberOfRooms`总是返回一个`Int?`而不是`Int` 要注意的是即使numberOfRooms是非可选`Int``Int?`)时这一点也成立。只要是通过可选链的请求就意味着最后`numberOfRooms`总是返回一个`Int?`而不是`Int`
@ -111,7 +111,7 @@ class Person {
```swift ```swift
class Residence { class Residence {
var rooms = Room[]() var rooms = [Room]()
var numberOfRooms: Int { var numberOfRooms: Int {
return rooms.count return rooms.count
} }

View File

@ -16,7 +16,7 @@ _类型转换_可以判断实例的类型也可以将实例看做是其父类
类型转换在 Swift 中使用`is``as`操作符实现。这两个操作符提供了一种简单达意的方式去检查值的类型或者转换它的类型。 类型转换在 Swift 中使用`is``as`操作符实现。这两个操作符提供了一种简单达意的方式去检查值的类型或者转换它的类型。
你也可以用来检查一个类是否实现了某个协议,就像在 [Checking for Protocol Conformance](Protocols.html#//apple_ref/doc/uid/TP40014097-CH25-XID_363)部分讲述的一样。 你也可以用来检查一个类是否实现了某个协议,就像在 [Checking for Protocol Conformance](21_Protocols.html#checking_for_protocol_conformance)部分讲述的一样。
<a name="defining_a_class_hierarchy_for_type_casting"></a> <a name="defining_a_class_hierarchy_for_type_casting"></a>
## 定义一个类层次作为例子 ## 定义一个类层次作为例子