Skip to content

实例方法

实例方法是属于某个类、结构体或枚举实例的函数。它们通过提供访问和修改实例属性的方式,或者提供与实例功能相关的操作,来支持实例的整体功能。

swift
class Counter {
    var count = 0
    
    // 实例方法
    func increment() {
        count += 1
    }
    
    func increment(by amount: Int) {
        count += amount
    }
    
    func reset() {
        count = 0
    }
}

// 使用实例方法
let counter = Counter()
counter.increment()  // count = 1
counter.increment(by: 5)  // count = 6
counter.reset()  // count = 0

方法参数可以同时拥有参数名称(在函数体内使用)和参数标签(在调用时使用)。例如 increment(by amount: Int) 中,by 是外部参数标签,amount 是内部参数名称。


self 属性

每个实例都有一个隐式的 self 属性,代表实例本身。在大多数情况下可以省略 self,但当参数名与属性名冲突时必须显式使用:

swift
struct Point {
    var x = 0.0, y = 0.0
    
    func isToTheRightOf(x: Double) -> Bool {
        return self.x > x  // 使用 self 区分属性和参数
    }
}

值类型的可变方法

结构体和枚举是值类型,默认不能在实例方法中修改属性。使用 mutating 关键字允许方法修改属性:

swift
struct Point {
    var x, y: Double
    
    mutating func moveBy(x deltaX: Double, y deltaY: Double) {
        x += deltaX
        y += deltaY
    }
}

var point = Point(x: 1.0, y: 1.0)
point.moveBy(x: 2.0, y: 3.0)  // (3.0, 4.0)

注意:不能在常量实例上调用可变方法。

可变方法还可以直接给 self 赋新值:

swift
mutating func moveBy(x deltaX: Double, y deltaY: Double) {
    self = Point(x: x + deltaX, y: y + deltaY)
}

对于枚举的可变方法:

swift
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() {  // 可被子类重写
        print("Type method")
    }
}

SomeClass.someTypeMethod()  // 直接通过类型调用

类型方法中的 self 指类型本身,可以省略类型名前缀访问其他类型成员。


实际应用示例

游戏关卡跟踪系统:

swift
struct LevelTracker {
    // 类型属性
    static var highestUnlockedLevel = 1
    
    // 类型方法
    static func unlock(_ level: Int) {
        if level > highestUnlockedLevel {
            highestUnlockedLevel = level
        }
    }
    
    static func isUnlocked(_ level: Int) -> Bool {
        return level <= highestUnlockedLevel
    }
    
    // 实例属性
    var currentLevel = 1
    
    // 实例方法(可变)
    @discardableResult
    mutating func advance(to level: Int) -> Bool {
        if LevelTracker.isUnlocked(level) {
            currentLevel = level
            return true
        }
        return false
    }
}

class Player {
    var tracker = LevelTracker()
    let name: String
    
    func complete(level: Int) {
        LevelTracker.unlock(level + 1)  // 解锁下一关
        tracker.advance(to: level + 1)  // 进入下一关
    }
    
    init(name: String) {
        self.name = name
    }
}

使用示例:

swift
let player = Player(name: "Alice")
player.complete(level: 1)
print(LevelTracker.highestUnlockedLevel)  // 2

var newPlayer = Player(name: "Bob")
if newPlayer.tracker.advance(to: 3) {
    print("进入第三关")
} else {
    print("第三关尚未解锁")  // 会执行这个
}

关键点总结

  1. 实例方法

    • 属于特定实例
    • 可以访问和修改实例属性
    • 通过点语法调用
  2. self 使用

    • 隐式可用,用于区分同名属性和参数
    • 值类型中可变方法可以给 self 赋新值
  3. 可变方法

    • 使用 mutating 关键字
    • 允许修改值类型的属性
    • 不能用于常量实例
  4. 类型方法

    • 使用 staticclass 定义
    • 通过类型名直接调用
    • 可以访问类型属性/方法
  5. 实际应用

    • 状态管理(如游戏关卡)
    • 共享配置(通过类型属性)
    • 工厂模式等

注意:Swift 的方法比 Objective-C 更灵活,不仅限于类,结构体和枚举也可以定义方法。