avatar
童琦杰
Feb 23, 2017Technology

Swift - 方法

实例方法

允许在类、结构和枚举中定义实例方法。一个实例方法可以调用该类型内所有的实例方法,可以访问该类型内的所有属性。

swift
class Counter {
    func increment() {
        // 方法实现
    }
}
let counter = Counter()
counter.increment()

从根本上来讲,方法跟函数的本质是一样的,只不过方法跟定义它的类型有关,不能像函数一样单独调用。所以,方法的参数定义与函数的参数定义原则也是一致的,默认地,Swift会给第一个参数一个本地参数名,会给第二个以及之后的参数一个本地和外部参数名。例如下面代码看到的。

swift
class Counter {
    func incrementBy(amount: Int, numberOfTimes: Int) { // 等效于incrementBy(_ amount: Int, numberOfTimes numberOfTimes: Int)
        // 方法实现
    }   
}

当然,如果你觉得默认的参数定义无法满足你的要求,你也可以显式地定义每个参数的本地参数名和外部参数名。记住,主动权在你。

我们知道,结构和枚举是值类型,对于值类型,它的属性值是不能在它们的实例方法内改变的。然而,如果你需要改变属性值,那么你需要使用关键字mutating声明该实例方法。这样,该实例方法支持对属性值的改变操作,甚至允许通过给属性self赋值新的实例。

swift
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声明静态方法。

swift
class SomeClass {
    class func someTypeMethod() {
        // 方法实现
    }
}

在一个类型的静态方法内,属性self引用的是类型本身而不是类型实例。

在一个类型的静态方法内,允许调用该类型的其他静态方法以及访问该类型的静态属性,并不需要添加类型名称作为前缀。

© 2015-2022 tongqijie.com 版权所有沪ICP备17000682号