diff --git a/source/chapter2/09_Classes_and_Structures.md b/source/chapter2/09_Classes_and_Structures.md index 9f3d9e65..3eee71bb 100755 --- a/source/chapter2/09_Classes_and_Structures.md +++ b/source/chapter2/09_Classes_and_Structures.md @@ -284,6 +284,6 @@ Swift 中`数组(Array)`和`字典(Dictionary)`类型均以结构体的 以下对`数组`和`结构体`的行为描述与对`NSArray`和`NSDictionary`的行为描述在本质上不同,后者是以类的形式实现,前者是以结构体的形式实现。`NSArray`和`NSDictionary`实例总是以对已有实例引用,而不是拷贝的方式被赋值和传递。 > 注意: -以下是对于数组,字典,字符串和其它值的`拷贝`的描述。 +以上是对于数组,字典,字符串和其它值的`拷贝`的描述。 在你的代码中,拷贝好像是确实是在有拷贝行为的地方产生过。然而,在 Swift 的后台中,只有确有必要,`实际(actual)`拷贝才会被执行。Swift 管理所有的值拷贝以确保性能最优化的性能,所以你也没有必要去避免赋值以保证最优性能。(实际赋值由系统管理优化) diff --git a/source/chapter2/14_Initialization.md b/source/chapter2/14_Initialization.md index 98638fc6..49816951 100755 --- a/source/chapter2/14_Initialization.md +++ b/source/chapter2/14_Initialization.md @@ -513,7 +513,7 @@ class RecipeIngredient: Food { self.quantity = quantity super.init(name: name) } - convenience init(name: String) { + override convenience init(name: String) { 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)`使用了跟`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`提供的版本。 diff --git a/source/chapter2/16_Automatic_Reference_Counting.md b/source/chapter2/16_Automatic_Reference_Counting.md index 5bb00b28..72b18bae 100755 --- a/source/chapter2/16_Automatic_Reference_Counting.md +++ b/source/chapter2/16_Automatic_Reference_Counting.md @@ -403,7 +403,7 @@ class HTMLElement { let name: String let text: String? - @lazy var asHTML: () -> String = { + lazy var asHTML: () -> String = { if let text = self.text { return "<\(self.name)>\(text)" } else { @@ -479,7 +479,7 @@ Swift 有如下要求:只要在闭包内使用`self`的成员,就要用`self 捕获列表放置在闭包参数列表和返回类型之前: ```swift -@lazy var someClosure: (Int, String) -> String = { +lazy var someClosure: (Int, String) -> String = { [unowned self] (index: Int, stringToProcess: String) -> String in // closure body goes here } @@ -488,7 +488,7 @@ Swift 有如下要求:只要在闭包内使用`self`的成员,就要用`self 如果闭包没有指定参数列表或者返回类型,则可以通过上下文推断,那么可以捕获列表放在闭包开始的地方,跟着是关键字`in`: ```swift -@lazy var someClosure: () -> String = { +lazy var someClosure: () -> String = { [unowned self] in // closure body goes here } @@ -511,7 +511,7 @@ class HTMLElement { let name: String let text: String? - @lazy var asHTML: () -> String = { + lazy var asHTML: () -> String = { [unowned self] in if let text = self.text { return "<\(self.name)>\(text)" diff --git a/source/chapter2/17_Optional_Chaining.md b/source/chapter2/17_Optional_Chaining.md index 185ed927..841e34db 100755 --- a/source/chapter2/17_Optional_Chaining.md +++ b/source/chapter2/17_Optional_Chaining.md @@ -71,7 +71,7 @@ if let roomCount = john.residence?.numberOfRooms { 这告诉 Swift 来链接可选`residence?`属性,如果`residence`存在则取回`numberOfRooms`的值。 -因为这种尝试获得`numberOfRooms`的操作有可能失败,可选链会返回`Int?`类型值,或者称作“可选`Int`”。当`residence`是空的时候(上例),选择`Int`将会为空,因此会出先无法访问`numberOfRooms`的情况。 +因为这种尝试获得`numberOfRooms`的操作有可能失败,可选链会返回`Int?`类型值,或者称作“可选`Int`”。当`residence`是空的时候(上例),选择`Int`将会为空,因此会出现无法访问`numberOfRooms`的情况。 要注意的是,即使numberOfRooms是非可选`Int`(`Int?`)时这一点也成立。只要是通过可选链的请求就意味着最后`numberOfRooms`总是返回一个`Int?`而不是`Int`。 @@ -111,7 +111,7 @@ class Person { ```swift class Residence { - var rooms = Room[]() + var rooms = [Room]() var numberOfRooms: Int { return rooms.count } diff --git a/source/chapter2/18_Type_Casting.md b/source/chapter2/18_Type_Casting.md index 14e69676..1f402a74 100755 --- a/source/chapter2/18_Type_Casting.md +++ b/source/chapter2/18_Type_Casting.md @@ -16,7 +16,7 @@ _类型转换_可以判断实例的类型,也可以将实例看做是其父类 类型转换在 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)部分讲述的一样。 ## 定义一个类层次作为例子