十、方法 Methods
1. 概述
方法 Methods 与函数类似,它是与某种类型(比如类、结构体、枚举)关联起来的函数 Function。关于Function,参考第五章函数
2. 方法的内部和外部参数名
Methods 的内部和外部参数名与 Function 类似,但是略有不同。
在Swift中,编译器默认会给 Methods 的第一个参数一个内部参数名 local parameter name,第二个后之后的参数给予内部和外部参数名 local and external parameter names。
class Counter { var count: Int = 0 func incrementBy(amount: Int, numberOfTimes: Int) { count += amount * numberOfTimes } }
可以在第二个参数前加上 (#),是这种规则明确生效。——实际上是速记外部参数名。
func incrementBy(amount: Int, #numberOfTimes: Int) { count += amount * numberOfTimes }
你也可以在第一个参数前加上(#),为第一个参数添加一个外部参数名。
有时你会希望覆盖掉上面编译器默认的命名行为,通过下划线(_),明确的表名参数名为外部参数名。
3. 在实例的方法中更改值类型 Modifying Value Types from Within Instance Methods
Structures 和 enumerations 是 Value Types 。默认情况下,值类型的实例不能更改值类型的属性 (原话是:the properties of a value type cannot be modified from within its instance methods.)。
如果你想通过某个方法更改结构体或枚举的属性,可以在方法前加上 mutating 关键字,表明可以在这个方法中改变(mutate or change)它的属性,这个方法所做的任何改变将会在它结束时,写回原来的结构体;这个方法甚至可以给它的 self 属性赋值,那么当这个方法结束时,新的实例将覆盖掉原来的实例。
struct Point { var x = 0.0, y = 0.0 mutating func moveByX(deltaX: Double, y deltaY: Double) { x += deltaX y += deltaY } } var somePoint = Point(x: 1.0, y: 1.0) somePoint.moveByX(2.0, y: 3.0) println("The point is now at (\(somePoint.x), \(somePoint.y))") // prints "The point is now at (3.0, 4.0)"
注意:你不能在 constant 型结构体中定义mutating 方法,因为即使它的属性为 variable 类型,也无法被改变。
let fixedPoint = Point(x: 3.0, y: 3.0) fixedPoint.moveByX(2.0, y: 3.0) // this will report an error
4. 在 Mutating 方法中给 self 赋值 Assigning to self Within a Mutating Method
4.1 Mutating 在结构体中使用
struct Point { var x = 0.0, y = 0.0 mutating func moveByX(deltaX: Double, y deltaY: Double) { self = Point(x: x + deltaX, y: y + deltaY) } }
上面版本中,调用实例的 moveByX 方法时,新的实例将覆盖掉原来的实例。
4.2 Mutating 在枚举中的使用
完成枚举一节后再继续本节内容。。。