This commit is contained in:
wuxing
2014-06-14 17:25:03 +08:00
parent 1c10a65bd3
commit a516af6a53
12 changed files with 36 additions and 36 deletions

View File

@ -5,7 +5,7 @@
# 关于 Swift # 关于 Swift
----------------- -----------------
Swift 是一种新的编程语言,用于编写 iOS 和 OS X 应用。Swift 结合了 C 和 Objective-C 的优点并且不受 C 兼容性的限制。Swift 采用安全的编程模式并添加了很多新特性这将使编程更简单更灵活也更有趣。Swift 是基于成熟而且倍受喜爱的 Cocoa 和 Cocoa Touch 框架,的降临将重新定义软件开发。 Swift 是一种新的编程语言,用于编写 iOS 和 OS X 应用。Swift 结合了 C 和 Objective-C 的优点并且不受 C 兼容性的限制。Swift 采用安全的编程模式并添加了很多新特性这将使编程更简单更灵活也更有趣。Swift 是基于成熟而且倍受喜爱的 Cocoa 和 Cocoa Touch 框架,的降临将重新定义软件开发。
Swift 的开发从很久之前就开始了。为了给 Swift 打好基础苹果公司改进了编译器调试器和框架结构。我们使用自动引用计数Automatic Reference Counting, ARC来简化内存管理。我们在 Foundation 和 Cocoa 的基础上构建框架栈并将其标准化。Objective-C 本身支持块、集合语法和模块,所以框架可以轻松支持现代编程语言技术。正是得益于这些基础工作,我们现在才能发布这样一个用于未来苹果软件开发的新语言。 Swift 的开发从很久之前就开始了。为了给 Swift 打好基础苹果公司改进了编译器调试器和框架结构。我们使用自动引用计数Automatic Reference Counting, ARC来简化内存管理。我们在 Foundation 和 Cocoa 的基础上构建框架栈并将其标准化。Objective-C 本身支持块、集合语法和模块,所以框架可以轻松支持现代编程语言技术。正是得益于这些基础工作,我们现在才能发布这样一个用于未来苹果软件开发的新语言。

View File

@ -364,7 +364,7 @@ print("\n")
// 68 111 103 33 240 159 144 182 // 68 111 103 33 240 159 144 182
``` ```
上面的例子中前四个10进制代码单元值 (68, 111, 103, 33) 代表了字符`D` `o` `g``!`们的 UTF-8 表示与 ASCII 表示相同。 上面的例子中前四个10进制代码单元值 (68, 111, 103, 33) 代表了字符`D` `o` `g``!`们的 UTF-8 表示与 ASCII 表示相同。
后四个代码单元值 (240, 159, 144, 182) 是`DOG FACE`的4字节 UTF-8 表示。 后四个代码单元值 (240, 159, 144, 182) 是`DOG FACE`的4字节 UTF-8 表示。
<a name="UTF-16"></a> <a name="UTF-16"></a>
@ -381,7 +381,7 @@ print("\n")
// 68 111 103 33 55357 56374 // 68 111 103 33 55357 56374
``` ```
同样,前四个代码单元值 (68, 111, 103, 33) 代表了字符`D` `o` `g``!`们的 UTF-16 代码单元和 UTF-8 完全相同。 同样,前四个代码单元值 (68, 111, 103, 33) 代表了字符`D` `o` `g``!`们的 UTF-16 代码单元和 UTF-8 完全相同。
第五和第六个代码单元值 (55357 和 56374) 是`DOG FACE`字符的UTF-16 表示。 第五和第六个代码单元值 (55357 和 56374) 是`DOG FACE`字符的UTF-16 表示。
第一个值为`U+D83D`(十进制值为 55357),第二个值为`U+DC36`(十进制值为 56374)。 第一个值为`U+D83D`(十进制值为 55357),第二个值为`U+DC36`(十进制值为 56374)。

View File

@ -227,7 +227,7 @@ let digitNames = [
let numbers = [16, 58, 510] let numbers = [16, 58, 510]
``` ```
如上代码创建了一个数字位和们名字映射的英文版本字典。 如上代码创建了一个数字位和们名字映射的英文版本字典。
同时定义了一个准备转换为字符串的整型数组。 同时定义了一个准备转换为字符串的整型数组。
您现在可以通过传递一个尾随闭包给`numbers``map`方法来创建对应的字符串版本数组。 您现在可以通过传递一个尾随闭包给`numbers``map`方法来创建对应的字符串版本数组。

View File

@ -27,7 +27,7 @@
可以在定义存储属性的时候指定默认值,请参考[构造过程](../chapter2/14_Initialization.html)一章的[默认属性值](../chapter2/14_Initialization.html#default_property_values)一节。也可以在构造过程中设置或修改存储属性的值,甚至修改常量存储属性的值,请参考[构造过程](../chapter2/14_Initialization.html)一章的[在初始化阶段修改常量存储属性](../chapter2/14_Initialization.html#modifying_constant_properties_during_initialization)一节。 可以在定义存储属性的时候指定默认值,请参考[构造过程](../chapter2/14_Initialization.html)一章的[默认属性值](../chapter2/14_Initialization.html#default_property_values)一节。也可以在构造过程中设置或修改存储属性的值,甚至修改常量存储属性的值,请参考[构造过程](../chapter2/14_Initialization.html)一章的[在初始化阶段修改常量存储属性](../chapter2/14_Initialization.html#modifying_constant_properties_during_initialization)一节。
下面的例子定义了一个名为`FixedLengthRange`的结构体,描述了一个在创建后无法修改值域宽度的区间: 下面的例子定义了一个名为`FixedLengthRange`的结构体,描述了一个在创建后无法修改值域宽度的区间:
``` ```
struct FixedLengthRange { struct FixedLengthRange {
@ -202,7 +202,7 @@ struct AlternativeRect {
> 注意: > 注意:
> >
> 必须使用`var`关键字定义计算属性,包括只读计算属性,因为们的值不是固定的。`let`关键字只用来声明常量属性,表示初始化后再也无法修改的值。 > 必须使用`var`关键字定义计算属性,包括只读计算属性,因为们的值不是固定的。`let`关键字只用来声明常量属性,表示初始化后再也无法修改的值。
只读计算属性的声明可以去掉`get`关键字和花括号: 只读计算属性的声明可以去掉`get`关键字和花括号:
@ -243,7 +243,7 @@ println("the volume of fourByFiveByTwo is \(fourByFiveByTwo.volume)")
> 注意: > 注意:
> >
> `willSet`和`didSet`监视器在属性初始化过程中不会被调用,们只会当属性的值在初始化之外的地方被设置时被调用。 > `willSet`和`didSet`监视器在属性初始化过程中不会被调用,们只会当属性的值在初始化之外的地方被设置时被调用。
这里是一个`willSet``didSet`的实际例子,其中定义了一个名为`StepCounter`的类,用来统计当人步行时的总步数,可以跟计步器或其他日常锻炼的统计装置的输入数据配合使用。 这里是一个`willSet``didSet`的实际例子,其中定义了一个名为`StepCounter`的类,用来统计当人步行时的总步数,可以跟计步器或其他日常锻炼的统计装置的输入数据配合使用。

View File

@ -285,7 +285,7 @@ class Player {
} }
``` ```
`Player`类创建一个新的`LevelTracker`实例来监测这个用户的发展进度。提供了`completedLevel`方法:一旦玩家完成某个指定等级就调用它。这个方法为所有玩家解锁下一等级,并且将当前玩家的进度更新为下一等级。(我们忽略了`advanceToLevel`返回的布尔值,因为之前调用`LevelTracker.unlockLevel`时就知道了这个等级已经被解锁了)。 `Player`类创建一个新的`LevelTracker`实例来监测这个用户的发展进度。提供了`completedLevel`方法:一旦玩家完成某个指定等级就调用它。这个方法为所有玩家解锁下一等级,并且将当前玩家的进度更新为下一等级。(我们忽略了`advanceToLevel`返回的布尔值,因为之前调用`LevelTracker.unlockLevel`时就知道了这个等级已经被解锁了)。
你还可以为一个新的玩家创建一个`Player`的实例,然后看这个玩家完成等级一时发生了什么: 你还可以为一个新的玩家创建一个`Player`的实例,然后看这个玩家完成等级一时发生了什么:
@ -297,7 +297,7 @@ println("highest unlocked level is now \(LevelTracker.highestUnlockedLevel)")
``` ```
如果你创建了第二个玩家,并尝试让开始一个没有被任何玩家解锁的等级,那么这次设置玩家当前等级的尝试将会失败: 如果你创建了第二个玩家,并尝试让开始一个没有被任何玩家解锁的等级,那么这次设置玩家当前等级的尝试将会失败:
``` ```
player = Player(name: "Beto") player = Player(name: "Beto")

View File

@ -274,7 +274,7 @@ Swift 提供了两种办法用来解决你在使用类的属性时所遇到的
john = Customer(name: "John Appleseed") john = Customer(name: "John Appleseed")
john!.card = CreditCard(number: 1234_5678_9012_3456, customer: john!) john!.card = CreditCard(number: 1234_5678_9012_3456, customer: john!)
在你关联两个实例后,们的引用关系如下图所示: 在你关联两个实例后,们的引用关系如下图所示:
![](https://developer.apple.com/library/prerelease/ios/documentation/Swift/Conceptual/Swift_Programming_Language/Art/unownedReference01_2x.png) ![](https://developer.apple.com/library/prerelease/ios/documentation/Swift/Conceptual/Swift_Programming_Language/Art/unownedReference01_2x.png)
@ -329,7 +329,7 @@ Swift 提供了两种办法用来解决你在使用类的属性时所遇到的
`Country`的构造函数调用了`City`的构造函数。然而,只有`Country`的实例完全初始化完后,`Country`的构造函数才能把`self`传给`City`的构造函数。([在两段式构造过程中有具体描述](14_Initialization.html) `Country`的构造函数调用了`City`的构造函数。然而,只有`Country`的实例完全初始化完后,`Country`的构造函数才能把`self`传给`City`的构造函数。([在两段式构造过程中有具体描述](14_Initialization.html)
为了满足这种需求通过在类型结尾处加上感叹号City!)的方式,将`Country``capitalCity`属性声明为隐式解析可选类型的属性。这表示像其他可选类型一样,`capitalCity`属性的默认值为`nil`,但是不需要展开的值就能访问它。([在隐式解析可选类型中有描述](01_The_Basics.html) 为了满足这种需求通过在类型结尾处加上感叹号City!)的方式,将`Country``capitalCity`属性声明为隐式解析可选类型的属性。这表示像其他可选类型一样,`capitalCity`属性的默认值为`nil`,但是不需要展开的值就能访问它。([在隐式解析可选类型中有描述](01_The_Basics.html)
由于`capitalCity`默认值为`nil`,一旦`Country`的实例在构造函数中给`name`属性赋值后,整个初始化过程就完成了。这代表一旦`name`属性被赋值后,`Country`的构造函数就能引用并传递隐式的`self``Country`的构造函数在赋值`capitalCity`时,就能将`self`作为参数传递给`City`的构造函数。 由于`capitalCity`默认值为`nil`,一旦`Country`的实例在构造函数中给`name`属性赋值后,整个初始化过程就完成了。这代表一旦`name`属性被赋值后,`Country`的构造函数就能引用并传递隐式的`self``Country`的构造函数在赋值`capitalCity`时,就能将`self`作为参数传递给`City`的构造函数。
@ -449,7 +449,7 @@ Swift 有如下要求:只要在闭包内使用`self`的成员,就要用`self
当闭包和捕获的实例总是互相引用时并且总是同时销毁时,将闭包内的捕获定义为无主引用。 当闭包和捕获的实例总是互相引用时并且总是同时销毁时,将闭包内的捕获定义为无主引用。
相反的,当捕获引用有时可能会是`nil`时,将闭包内的捕获定义为弱引用。弱引用总是可选类型,并且当引用的实例被销毁后,弱引用的值会自动置为`nil`。这使我们可以在闭包内检查们是否存在。 相反的,当捕获引用有时可能会是`nil`时,将闭包内的捕获定义为弱引用。弱引用总是可选类型,并且当引用的实例被销毁后,弱引用的值会自动置为`nil`。这使我们可以在闭包内检查们是否存在。
>注意: >注意:
> >

View File

@ -24,7 +24,7 @@ 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则失败。
@ -232,7 +232,7 @@ Swift 的可选链和 Objective-C 中的消息为空有些相像,但是 Swift
如果你试图通过可选链获得`Int`值,不论使用了多少层链接返回的总是`Int?` 如果你试图通过可选链获得`Int`值,不论使用了多少层链接返回的总是`Int?`
相似的,如果你试图通过可选链获得`Int?`值,不论使用了多少层链接返回的总是`Int?` 相似的,如果你试图通过可选链获得`Int?`值,不论使用了多少层链接返回的总是`Int?`
下面的例子试图获取`john``residence`属性里的`address``street`属性。这里使用了两层可选链来联系`residence``address`属性,们两者都是可选类型: 下面的例子试图获取`john``residence`属性里的`address``street`属性。这里使用了两层可选链来联系`residence``address`属性,们两者都是可选类型:
if let johnsStreet = john.residence?.address?.street { if let johnsStreet = john.residence?.address?.street {
println("John's street name is \(johnsStreet).") println("John's street name is \(johnsStreet).")

View File

@ -525,7 +525,7 @@
init(legs: Int) { self.legs = legs } init(legs: Int) { self.legs = legs }
} }
`Circle,Country,Animal`并没有一个相同的基类,所以采用`AnyObject`类型的数组来装载在们的实例,如下所示: `Circle,Country,Animal`并没有一个相同的基类,所以采用`AnyObject`类型的数组来装载在们的实例,如下所示:
let objects: AnyObject[] = [ let objects: AnyObject[] = [
Circle(radius: 2.0), Circle(radius: 2.0),

View File

@ -155,7 +155,7 @@
} }
} }
这个结构体在栈中使用一个`Array`性质的`items`存储值。`Stack`提供两个方法:`push``pop`,从栈中压进一个值和移除一个值。这些方法标记为可变的,因为们需要修改(或*转换*)结构体的`items`数组。 这个结构体在栈中使用一个`Array`性质的`items`存储值。`Stack`提供两个方法:`push``pop`,从栈中压进一个值和移除一个值。这些方法标记为可变的,因为们需要修改(或*转换*)结构体的`items`数组。
上面所展现的`IntStack`类型只能用于`Int`值,不过,其对于定义一个泛型`Stack`类(可以处理*任何*类型值的栈)是非常有用的。 上面所展现的`IntStack`类型只能用于`Int`值,不过,其对于定义一个泛型`Stack`类(可以处理*任何*类型值的栈)是非常有用的。
@ -213,7 +213,7 @@
这个需求强制加上一个类型约束作用于`Dictionary`的键上,当然其键类型必须遵循`Hashable`协议Swift 标准库中定义的一个特定协议)。所有的 Swift 基本类型(如`String``Int` `Double``Bool`)默认都是可哈希。 这个需求强制加上一个类型约束作用于`Dictionary`的键上,当然其键类型必须遵循`Hashable`协议Swift 标准库中定义的一个特定协议)。所有的 Swift 基本类型(如`String``Int` `Double``Bool`)默认都是可哈希。
当你创建自定义泛型类型时,你可以定义你自己的类型约束,当然,这些约束要支持泛型编程的强力特征中的多数。抽象概念如`可哈希`具有的类型特征是根据们概念特征来界定的,而不是们的直接类型特征。 当你创建自定义泛型类型时,你可以定义你自己的类型约束,当然,这些约束要支持泛型编程的强力特征中的多数。抽象概念如`可哈希`具有的类型特征是根据们概念特征来界定的,而不是们的直接类型特征。
### 类型约束语法 ### 类型约束语法
@ -391,7 +391,7 @@ Swift的`Array`已经提供`append`方法,一个`count`属性和通过下标
下面的列子定义了一个名为`allItemsMatch`的泛型函数,用来检查是否两个`Container`单例包含具有相同顺序的相同元素。如果匹配到所有的元素,那么返回一个为`true``Boolean`值,反之,则相反。 下面的列子定义了一个名为`allItemsMatch`的泛型函数,用来检查是否两个`Container`单例包含具有相同顺序的相同元素。如果匹配到所有的元素,那么返回一个为`true``Boolean`值,反之,则相反。
这两个容器可以被检查出是否是相同类型的容器(虽然它们可以是),但们确实拥有相同类型的元素。这个需求通过一个类型约束和`where`语句结合来表示: 这两个容器可以被检查出是否是相同类型的容器(虽然它们可以是),但们确实拥有相同类型的元素。这个需求通过一个类型约束和`where`语句结合来表示:
func allItemsMatch< func allItemsMatch<
C1: Container, C2: Container C1: Container, C2: Container
@ -434,11 +434,11 @@ Swift的`Array`已经提供`append`方法,一个`count`属性和通过下标
`someContainer``anotherContainer`包含相同的元素类型。 `someContainer``anotherContainer`包含相同的元素类型。
`someContainer`中的元素可以通过不等于操作(`!=`)来检查它们是否彼此不同。 `someContainer`中的元素可以通过不等于操作(`!=`)来检查它们是否彼此不同。
第三个和第四个要求结合起来的意思是`anotherContainer`中的元素也可以通过 `!=` 操作来检查,因为们在`someContainer`中元素确实是相同的类型。 第三个和第四个要求结合起来的意思是`anotherContainer`中的元素也可以通过 `!=` 操作来检查,因为们在`someContainer`中元素确实是相同的类型。
这些要求能够使`allItemsMatch`函数比较两个容器,即便们是不同的容器类型。 这些要求能够使`allItemsMatch`函数比较两个容器,即便们是不同的容器类型。
`allItemsMatch`首先检查两个容器是否拥有同样数目的items如果们的元素数目不同,没有办法进行匹配,函数就会`false` `allItemsMatch`首先检查两个容器是否拥有同样数目的items如果们的元素数目不同,没有办法进行匹配,函数就会`false`
检查完之后,函数通过`for-in`循环和半闭区间操作(..)来迭代`someContainer`中的所有元素。对于每个元素,函数检查是否`someContainer`中的元素不等于对应的`anotherContainer`中的元素,如果这两个元素不等,则这两个容器不匹配,返回`false` 检查完之后,函数通过`for-in`循环和半闭区间操作(..)来迭代`someContainer`中的所有元素。对于每个元素,函数检查是否`someContainer`中的元素不等于对应的`anotherContainer`中的元素,如果这两个元素不等,则这两个容器不匹配,返回`false`
@ -460,7 +460,7 @@ Swift的`Array`已经提供`append`方法,一个`count`属性和通过下标
} }
// 输出 "All items match." // 输出 "All items match."
上面的例子创建一个`Stack`单例来存储`String`,然后压了三个字符串进栈。这个例子也创建了一个`Array`单例,并初始化包含三个同栈里一样的原始字符串。即便栈和数组否是不同的类型,但们都遵循`Container`协议,而且们都包含同样的类型值。你因此可以调用`allItemsMatch`函数,用这两个容器作为它的参数。在上面的例子中,`allItemsMatch`函数正确的显示了所有的这两个容器的`items`匹配。 上面的例子创建一个`Stack`单例来存储`String`,然后压了三个字符串进栈。这个例子也创建了一个`Array`单例,并初始化包含三个同栈里一样的原始字符串。即便栈和数组否是不同的类型,但们都遵循`Container`协议,而且们都包含同样的类型值。你因此可以调用`allItemsMatch`函数,用这两个容器作为它的参数。在上面的例子中,`allItemsMatch`函数正确的显示了所有的这两个容器的`items`匹配。
[1]: ../chapter2/06_Functions.html [1]: ../chapter2/06_Functions.html
[2]: https://developer.apple.com/library/prerelease/ios/documentation/Swift/Conceptual/Swift_Programming_Language/Art/stackPushPop_2x.png [2]: https://developer.apple.com/library/prerelease/ios/documentation/Swift/Conceptual/Swift_Programming_Language/Art/stackPushPop_2x.png

View File

@ -426,7 +426,7 @@ Swift无所知道自定义类型是否相等或不等因为等于或者不等
} }
``` ```
上述代码实现了相等运算符`==`来判断两个`Vector2D`对象是否有相等的值,相等的概念就是们有相同的`x`值和相同的`y`值,我们就用这个逻辑来实现。接着使用`==`的结果实现了不相等运算符`!=` 上述代码实现了相等运算符`==`来判断两个`Vector2D`对象是否有相等的值,相等的概念就是们有相同的`x`值和相同的`y`值,我们就用这个逻辑来实现。接着使用`==`的结果实现了不相等运算符`!=`
现在我们可以使用这两个运算符来判断两个`Vector2D`对象是否相等。 现在我们可以使用这两个运算符来判断两个`Vector2D`对象是否相等。
@ -489,4 +489,4 @@ let plusMinusVector = firstVector +- secondVector
// plusMinusVector 此时的值为 (4.0, -2.0) // plusMinusVector 此时的值为 (4.0, -2.0)
``` ```
这个运算符把两个向量的`x`相加,把向量的`y`相减。因为实际是属于加减运算,所以让它保持了和加法一样的结合性和优先级(`left``140`)。查阅完整的Swift默认结合性和优先级的设置请移步[表达式](../chapter3/04_Expressions.html); 这个运算符把两个向量的`x`相加,把向量的`y`相减。因为实际是属于加减运算,所以让它保持了和加法一样的结合性和优先级(`left``140`)。查阅完整的Swift默认结合性和优先级的设置请移步[表达式](../chapter3/04_Expressions.html);

View File

@ -28,7 +28,7 @@
新的命名好的枚举,结构,类和协议类型。你也可以使用一条声明来延长一个已经存在的命名好的类型的行为。或者在你的 新的命名好的枚举,结构,类和协议类型。你也可以使用一条声明来延长一个已经存在的命名好的类型的行为。或者在你的
程序里引入在其他地方声明的符号。 程序里引入在其他地方声明的符号。
在swift中大多数声明在某种意义上讲也是执行或同事声明它们的初始化定义。这意味着因为协议和们的成员不匹配, 在swift中大多数声明在某种意义上讲也是执行或同事声明它们的初始化定义。这意味着因为协议和们的成员不匹配,
大多数协议成员需要单独的声明。为了方便起见也因为这些区别在swift里不是很重要声明语句同时包含了声明和定义。 大多数协议成员需要单独的声明。为了方便起见也因为这些区别在swift里不是很重要声明语句同时包含了声明和定义。
>GRAMMAR OF A DECLARATION >GRAMMAR OF A DECLARATION
@ -71,7 +71,7 @@
##模块范围 ##模块范围
模块范围定义了对模块中其他源文件可见的代码。待改进在swift的源文件中最高级别的代码由零个或多个语句 模块范围定义了对模块中其他源文件可见的代码。待改进在swift的源文件中最高级别的代码由零个或多个语句
声明和表达组成。变量,常量和其他的声明语句在一个源文件的最顶级被声明,使得们对同一模块中的每个源文件都是可见的。 声明和表达组成。变量,常量和其他的声明语句在一个源文件的最顶级被声明,使得们对同一模块中的每个源文件都是可见的。
>GRAMMAR OF A TOP-LEVEL DECLARATION >GRAMMAR OF A TOP-LEVEL DECLARATION
@ -122,7 +122,7 @@
当常量的值被给定后,常量就将常量名称和表达式初始值不变的结合在了一起,而且不能更改。 当常量的值被给定后,常量就将常量名称和表达式初始值不变的结合在了一起,而且不能更改。
这意味着如果常量以类的形式被初始化,类本身的内容是可以改变的,但是常量和类之间的结合关系是不能改变的。 这意味着如果常量以类的形式被初始化,类本身的内容是可以改变的,但是常量和类之间的结合关系是不能改变的。
当一个常量被声明为全局变量,它必须被给定一个初始值。当一个常量在类或者结构体中被声明时,被认为是一个常量 当一个常量被声明为全局变量,它必须被给定一个初始值。当一个常量在类或者结构体中被声明时,被认为是一个常量
属性。常量并不是可计算的属性因此不包含getters和setters。译者注getters和setters不知道怎么翻译待改进 属性。常量并不是可计算的属性因此不包含getters和setters。译者注getters和setters不知道怎么翻译待改进
如果常量名是一个元祖形式,元祖中的每一项初始化表达式中都要有对应的值 如果常量名是一个元祖形式,元祖中的每一项初始化表达式中都要有对应的值
@ -168,7 +168,7 @@
var variable name: type = expression var variable name: type = expression
你可以在全局,函数内,或者在类和结构体的声明(context)中使用这种形式来声明一个变量。当变量以这种形式 你可以在全局,函数内,或者在类和结构体的声明(context)中使用这种形式来声明一个变量。当变量以这种形式
在全局或者一个函数内被声明时,它代表一个存储型变量。当在类或者结构体中被声明时,代表一个存储型变量属性。 在全局或者一个函数内被声明时,它代表一个存储型变量。当在类或者结构体中被声明时,代表一个存储型变量属性。
构造器表达式可以被 构造器表达式可以被
@ -190,8 +190,8 @@
} }
你可以在全局,函数体内或者类,结构体,枚举,扩展声明的上下文中使用这种形式的声明。 你可以在全局,函数体内或者类,结构体,枚举,扩展声明的上下文中使用这种形式的声明。
当变量以这种形式在全局或者一个函数内被声明时,它代表一个计算型变量。当在类,结构体,枚举,扩展声明的上下文 当变量以这种形式在全局或者一个函数内被声明时,它代表一个计算型变量。当在类,结构体,枚举,扩展声明的上下文
中中被声明时,代表一个计算型变量属性。 中中被声明时,代表一个计算型变量属性。
getter用来读取变量值setter用来写入变量值。setter子句是可选择的只有getter是必需的你可以将这些语句 getter用来读取变量值setter用来写入变量值。setter子句是可选择的只有getter是必需的你可以将这些语句
都省略,只是简单的直接返回请求值,正如在只读计算属性(read-only computed properites)中描述的那样。 都省略,只是简单的直接返回请求值,正如在只读计算属性(read-only computed properites)中描述的那样。
@ -219,7 +219,7 @@ setter的初始名为newValue正如在seter声明速记(shorthand setter decl
你可以在全局,函数体内或者类,结构体,枚举,扩展声明的上下文中使用这种形式的声明。 你可以在全局,函数体内或者类,结构体,枚举,扩展声明的上下文中使用这种形式的声明。
当变量以这种形式在全局或者一个函数内被声明时,监视器代表一个存储型变量监视器; 当变量以这种形式在全局或者一个函数内被声明时,监视器代表一个存储型变量监视器;
在类,结构体,枚举,扩展声明的上下文中被声明时,监视器代表属性监视器。 在类,结构体,枚举,扩展声明的上下文中被声明时,监视器代表属性监视器。
你可以为适合的监视器添加任何存储型属性。你也可以通过重写子类属性的方式为适合的监视器添加任何继承的属性 你可以为适合的监视器添加任何存储型属性。你也可以通过重写子类属性的方式为适合的监视器添加任何继承的属性
(无论是存储型还是计算型的),参见重写属性监视器(overriding properyt observers)。 (无论是存储型还是计算型的),参见重写属性监视器(overriding properyt observers)。
@ -228,7 +228,7 @@ setter的初始名为newValue正如在seter声明速记(shorthand setter decl
所有包含监视器的变量声明都必须有类型注释(type annotation)。 所有包含监视器的变量声明都必须有类型注释(type annotation)。
当变量或属性的值被改变时willset和didset监视器提供了一个监视方法适当的回应 当变量或属性的值被改变时willset和didset监视器提供了一个监视方法适当的回应
监视器不会在变量或属性第一次初始化时不会被运行,们只有在值被外部初始化语句改变时才会被运行。 监视器不会在变量或属性第一次初始化时不会被运行,们只有在值被外部初始化语句改变时才会被运行。
willset监视器只有在变量或属性值被改变之前运行。新的值作为一个常量经过过willset监视器因此不可以在 willset监视器只有在变量或属性值被改变之前运行。新的值作为一个常量经过过willset监视器因此不可以在
willset语句中改变它。didset监视器在变量或属性值被改变后立即运行。和willset监视器相反为了以防止你仍然 willset语句中改变它。didset监视器在变量或属性值被改变后立即运行。和willset监视器相反为了以防止你仍然
@ -670,7 +670,7 @@ protocol-property-declaration → variable-declaration-head­variable-name­type
###协议方法声明 ###协议方法声明
协议声明了一致性类型必须在协议声明的主体里通过引入一个协议方法声明来实现一个方法. 协议声明了一致性类型必须在协议声明的主体里通过引入一个协议方法声明来实现一个方法.
协议方法声明和函数方法声明有着相同的形式,包含如下两条规则:们不包括函数体,你不能在类的声明内为们的 协议方法声明和函数方法声明有着相同的形式,包含如下两条规则:们不包括函数体,你不能在类的声明内为们的
参数提供初始值.举例来说,符合的类型执行协议必需的方法。参见必需方法一节。 参数提供初始值.举例来说,符合的类型执行协议必需的方法。参见必需方法一节。
使用关键字class可以在协议声明中声明一个类或必需的静态方法。执行这些方法的类也用关键字class声明。 使用关键字class可以在协议声明中声明一个类或必需的静态方法。执行这些方法的类也用关键字class声明。
@ -753,7 +753,7 @@ getter语句可以选择是否包含setter语句。
以一个将所有类属性完全初始化的指定构造器的调用作为结束。便利构造器不能调用超类的构造器。 以一个将所有类属性完全初始化的指定构造器的调用作为结束。便利构造器不能调用超类的构造器。
你可以使用requierd关键字将便利构造器和指定构造器标记为每个子类的构造器都必须拥有的。因为指定构造器 你可以使用requierd关键字将便利构造器和指定构造器标记为每个子类的构造器都必须拥有的。因为指定构造器
不被子类继承,们必须被立即执行。当子类直接执行所有超类的指定构造器(或使用便利构造器重写指定构造器)时, 不被子类继承,们必须被立即执行。当子类直接执行所有超类的指定构造器(或使用便利构造器重写指定构造器)时,
必需的便利构造器可以被隐式的执行,亦可以被继承。不像方法,下标脚本那样,你不需要为这些重写的构造器标注 必需的便利构造器可以被隐式的执行,亦可以被继承。不像方法,下标脚本那样,你不需要为这些重写的构造器标注
overrride关键字。 overrride关键字。

View File

@ -17,7 +17,7 @@
模式pattern代表了单个值或者复合值的结构。例如元组`(1, 2)`的结构是逗号分隔的,包含两个元素的列表。因为模式代表一种值的结构,而不是特定的某个值,你可以把模式和各种同类型的值匹配起来。比如,`(x, y)`可以匹配元组`(1, 2)`,以及任何含两个元素的元组。除了将模式与一个值匹配外,你可以从合成值中提取出部分或全部,然后分别把各个部分和一个常量或变量绑定起来。 模式pattern代表了单个值或者复合值的结构。例如元组`(1, 2)`的结构是逗号分隔的,包含两个元素的列表。因为模式代表一种值的结构,而不是特定的某个值,你可以把模式和各种同类型的值匹配起来。比如,`(x, y)`可以匹配元组`(1, 2)`,以及任何含两个元素的元组。除了将模式与一个值匹配外,你可以从合成值中提取出部分或全部,然后分别把各个部分和一个常量或变量绑定起来。
在Swift中模式出现在变量和常量的声明在它们的左侧`for-in`语句和`switch`语句(在们的case标签中。尽管任何模式都可以出现在`switch`语句的case标签中但在其他情况下只有通配符模式wildcard pattern标识符模式identifier pattern和包含这两种模式的模式才能出现。 在Swift中模式出现在变量和常量的声明在它们的左侧`for-in`语句和`switch`语句(在们的case标签中。尽管任何模式都可以出现在`switch`语句的case标签中但在其他情况下只有通配符模式wildcard pattern标识符模式identifier pattern和包含这两种模式的模式才能出现。
你可以为通配符模式wildcard pattern标识符模式identifier pattern和元组模式tuple pattern指定类型注释用来限制这种模式只匹配某种类型的值。 你可以为通配符模式wildcard pattern标识符模式identifier pattern和元组模式tuple pattern指定类型注释用来限制这种模式只匹配某种类型的值。
@ -134,7 +134,7 @@
is type is type
pattern as type pattern as type
`is`模式匹配一个值如果这个值的类型在运行时runtime`is`模式右边的指定类型(或者那个类型的子类)是一致的。`is`模式和`is`操作符一样,们都进行类型转换,但是抛弃了返回的类型。 `is`模式匹配一个值如果这个值的类型在运行时runtime`is`模式右边的指定类型(或者那个类型的子类)是一致的。`is`模式和`is`操作符一样,们都进行类型转换,但是抛弃了返回的类型。
`as`模式匹配一个值如果这个值的类型在运行时runtime`as`模式右边的指定类型(或者那个类型的子类)是一致的。一旦匹配成功,匹配的值的类型被转换成`as`模式左边指定的模式。 `as`模式匹配一个值如果这个值的类型在运行时runtime`as`模式右边的指定类型(或者那个类型的子类)是一致的。一旦匹配成功,匹配的值的类型被转换成`as`模式左边指定的模式。