From 3aeba381d7eb0d44ef7d110e403a6459c06b795a Mon Sep 17 00:00:00 2001 From: stanzhai Date: Sat, 14 Jun 2014 17:48:50 +0800 Subject: [PATCH] fix 2.11 methods --- source/chapter2/11_Methods.md | 61 +++++++++++++++++------------------ 1 file changed, 30 insertions(+), 31 deletions(-) diff --git a/source/chapter2/11_Methods.md b/source/chapter2/11_Methods.md index 6ddeb02c..059ac4c1 100644 --- a/source/chapter2/11_Methods.md +++ b/source/chapter2/11_Methods.md @@ -1,15 +1,13 @@ -> 翻译:pp-prog - -> 校对:zqp +> 翻译:pp-prog +> 校对:zqp # 方法(Methods) ----------------- - 本页包含内容: -- [实例方法(Instance Methods](#instance_methods) -- [类型方法(Type Methods)](#type_methods) +- [实例方法(Instance Methods](#instance_methods) +- [类型方法(Type Methods)](#type_methods) **方法**是与某些特定类型相关联的函数。类、结构体、枚举都可以定义实例方法;实例方法为给定类型的实例封装了具体的任务与功能。类、结构体、枚举也可以定义类型方法;类型方法与类型本身相关联。类型方法与 Objective-C 中的类方法(class methods)相似。 @@ -24,7 +22,7 @@ 下面的例子,定义一个很简单的类`Counter`,`Counter`能被用来对一个动作发生的次数进行计数: -``` +```swift class Counter { var count = 0 func increment() { @@ -48,7 +46,7 @@ class Counter { 和调用属性一样,用点语法(dot syntax)调用实例方法: -``` +```swift let counter = Counter() // 初始计数值是0 counter.increment() @@ -58,6 +56,7 @@ class Counter { counter.reset() // 计数值现在是0 ``` + ### 方法的局部参数名称和外部参数名称(Local and External Parameter Names for Methods) @@ -69,7 +68,7 @@ Swift 中的方法和 Objective-C 中的方法极其相似。像在 Objective-C 看看下面这个`Counter`的另一个版本(它定义了一个更复杂的`incrementBy`方法): -``` +```swift class Counter { var count: Int = 0 func incrementBy(amount: Int, numberOfTimes: Int) { @@ -80,7 +79,7 @@ class Counter { `incrementBy`方法有两个参数: `amount`和`numberOfTimes`。默认情况下,Swift 只把`amount`当作一个局部名称,但是把`numberOfTimes`即看作局部名称又看作外部名称。下面调用这个方法: -``` +```swift let counter = Counter() counter.incrementBy(5, numberOfTimes: 3) // counter value is now 15 @@ -90,9 +89,9 @@ counter.incrementBy(5, numberOfTimes: 3) 这种默认的行为能够有效的处理方法(method),类似于在参数`numberOfTimes`前写一个井号(`#`): -``` +```swift func incrementBy(amount: Int, #numberOfTimes: Int) { - count += amount * numberOfTimes + count += amount * numberOfTimes } ``` @@ -111,7 +110,8 @@ func incrementBy(amount: Int, #numberOfTimes: Int) { 类型的每一个实例都有一个隐含属性叫做`self`,`self`完全等同于该实例本身。你可以在一个实例的实例方法中使用这个隐含的`self`属性来引用当前实例。 上面例子中的`increment`方法还可以这样写: -``` + +```swift func increment() { self.count++ } @@ -123,7 +123,7 @@ func increment() { 下面的例子中,`self`消除方法参数`x`和实例属性`x`之间的歧义: -``` +```swift struct Point { var x = 0.0, y = 0.0 func isToTheRightOfX(x: Double) -> Bool { @@ -148,7 +148,7 @@ if somePoint.isToTheRightOfX(1.0) { 要使用`变异`方法, 将关键字`mutating` 放到方法的`func`关键字之前就可以了: -``` +```swift struct Point { var x = 0.0, y = 0.0 mutating func moveByX(deltaX: Double, y deltaY: Double) { @@ -166,17 +166,18 @@ println("The point is now at (\(somePoint.x), \(somePoint.y))") 注意:不能在结构体类型常量上调用变异方法,因为常量的属性不能被改变,即使想改变的是常量的变量属性也不行,详情参见[存储属性和实例变量]("10_Properties.html") -``` +```swift let fixedPoint = Point(x: 3.0, y: 3.0) fixedPoint.moveByX(2.0, y: 3.0) // this will report an error ``` + ### 在变异方法中给self赋值(Assigning to self Within a Mutating Method) 变异方法能够赋给隐含属性`self`一个全新的实例。上面`Point`的例子可以用下面的方式改写: -``` +```swift struct Point { var x = 0.0, y = 0.0 mutating func moveByX(deltaX: Double, y deltaY: Double) { @@ -189,7 +190,7 @@ struct Point { 枚举的变异方法可以把`self`设置为相同的枚举类型中不同的成员: -``` +```swift enum TriStateSwitch { case Off, Low, High mutating func next() { @@ -217,13 +218,12 @@ ovenLight.next() 实例方法是被类型的某个实例调用的方法。你也可以定义类型本身调用的方法,这种方法就叫做**类型方法**。声明类的类型方法,在方法的`func`关键字之前加上关键字`class`;声明结构体和枚举的类型方法,在方法的`func`关键字之前加上关键字`static`。 -> 注意: - -> 在 Objective-C 里面,你只能为 Objective-C 的类定义类型方法(type-level methods)。在 Swift 中,你可以为所有的类、结构体和枚举定义类型方法:每一个类型方法都被它所支持的类型显式包含。 +> 注意: +> 在 Objective-C 里面,你只能为 Objective-C 的类定义类型方法(type-level methods)。在 Swift 中,你可以为所有的类、结构体和枚举定义类型方法:每一个类型方法都被它所支持的类型显式包含。 类型方法和实例方法一样用点语法调用。但是,你是在类型层面上调用这个方法,而不是在实例层面上调用。下面是如何在`SomeClass`类上调用类型方法的例子: -``` +```swift class SomeClass { class func someTypeMethod() { // type method implementation goes here @@ -240,7 +240,7 @@ SomeClass.someTypeMethod() 游戏初始时,所有的游戏等级(除了等级 1)都被锁定。每次有玩家完成一个等级,这个等级就对这个设备上的所有玩家解锁。`LevelTracker`结构体用静态属性和方法监测游戏的哪个等级已经被解锁。它还监测每个玩家的当前等级。 -``` +```swift struct LevelTracker { static var highestUnlockedLevel = 1 static func unlockLevel(level: Int) { @@ -271,7 +271,7 @@ struct LevelTracker { 下面,`Player`类使用`LevelTracker`来监测和更新每个玩家的发展进度: -``` +```swift class Player { var tracker = LevelTracker() let playerName: String @@ -289,22 +289,21 @@ class Player { 你还可以为一个新的玩家创建一个`Player`的实例,然后看这个玩家完成等级一时发生了什么: -``` +```swift var player = Player(name: "Argyrios") player.completedLevel(1) println("highest unlocked level is now \(LevelTracker.highestUnlockedLevel)") -// 输出 "highest unlocked level is now 2"(最高等级现在是2 -) +// 输出 "highest unlocked level is now 2"(最高等级现在是2) ``` 如果你创建了第二个玩家,并尝试让他开始一个没有被任何玩家解锁的等级,那么这次设置玩家当前等级的尝试将会失败: -``` +```swift player = Player(name: "Beto") if player.tracker.advanceToLevel(6) { -println("player is now on level 6") + println("player is now on level 6") } else { -println("level 6 has not yet been unlocked") + println("level 6 has not yet been unlocked") } // 输出 "level 6 has not yet been unlocked"(等级6还没被解锁) -``` +``` \ No newline at end of file