允许在类、结构和枚举中定义实例方法。一个实例方法可以调用该类型内所有的实例方法,可以访问该类型内的所有属性。
class Counter {
func increment() {
// 方法实现
}
}
let counter = Counter()
counter.increment()
从根本上来讲,方法跟函数的本质是一样的,只不过方法跟定义它的类型有关,不能像函数一样单独调用。所以,方法的参数定义与函数的参数定义原则也是一致的,默认地,Swift会给第一个参数一个本地参数名,会给第二个以及之后的参数一个本地和外部参数名。例如下面代码看到的。
class Counter {
func incrementBy(amount: Int, numberOfTimes: Int) { // 等效于incrementBy(_ amount: Int, numberOfTimes numberOfTimes: Int)
// 方法实现
}
}
当然,如果你觉得默认的参数定义无法满足你的要求,你也可以显式地定义每个参数的本地参数名和外部参数名。记住,主动权在你。
我们知道,结构和枚举是值类型,对于值类型,它的属性值是不能在它们的实例方法内改变的。然而,如果你需要改变属性值,那么你需要使用关键字mutating声明该实例方法。这样,该实例方法支持对属性值的改变操作,甚至允许通过给属性self赋值新的实例。
struct Point {
var x = 0.0, y = 0.0
mutating func moveByX(deltaX: Double, y deltaY: Double) {
x += deltaX
y += deltaY
}
}
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)
}
}
enum TriStateSwitch {
case Off, Low, High
mutating func next() {
switch self {
case Off:
self = Low
case Low:
self = High
case High:
self = Off
}
}
}
使用关键字static声明静态方法,如果允许子类重载父类的方法,那么使用关键字class声明静态方法。
class SomeClass {
class func someTypeMethod() {
// 方法实现
}
}
在一个类型的静态方法内,属性self引用的是类型本身而不是类型实例。
在一个类型的静态方法内,允许调用该类型的其他静态方法以及访问该类型的静态属性,并不需要添加类型名称作为前缀。