从这篇文章,你将学习到如何使用 Swift 的方法,方法可以定义在类、结构体和枚举中,方法简单来说就是和特定类型关联的函数。

Swift Methods

实例方法

基本概念

下面的示例中定义了 3 个实例方法 incrementincrementBy(_:)reset,它们都操作了实例变量 count

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()
counter.increment(by: 2)
counter.reset()

关于方法的参数和返回值,可以更多参考 Swift 函数,都是一样的。

self

每一个实例都有一个隐含属性叫 self,它就代表实例本身,下面示例中 self.x 指就是实例的属性 x,和方法的参数 x 区分开来。

struct Point {
  var x = 0.0, y = 0.0
  func isToTheRightOf(x: Double) -> Bool {
    return self.x > x
  }
}

通过实例方法修改值类型

结构体和枚举都是值类型,默认来说,不能通过实例方法修改值类型的属性,但是可以在方法前面添加 mutating 来打破这个规则,搞得这么麻烦就是不鼓励大家这么用。

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

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

类型方法

前面介绍的实例方法,在某一个实例上调用。当然,还可以定义在类型上调用的方法,也就是类型方法。在 func 前面加 static 来定义类型方法;在 func 前面加 class 也可以定义类型方法,不过子类就可以覆盖其实现。

struct LevelTracker {
  static var highesetUnlockedLevel = 1
  var currentLevel = 1
  
  static func unlock(_ level: Int) {
    if level > highesetUnlockedLevel {
      highesetUnlockedLevel = level
    }
  }
  
  static func isUnlocked(_ level: Int) -> Bool {
    return level <= highesetUnlockedLevel
  }
  
  mutating func advance(to level: Int) -> Bool {
    if LevelTracker.isUnlocked(level) {
      currentLevel = level
      return true
    } else {
      return false
    }
  }
}

注意,类型方法中引用类型属性,不需要通过类型名称。