--- gitea: none include_toc: true --- ### 方法 枚举、结构体、类都可以定义实例方法、类方法 * 实例方法(Instance Method) * 通过实例调用 * 类方法(Type Method) * 通过类型调用,用 `static` 或者 `class` 关键字定义 ```swift class Car { static var cout = 0 init() { Car.cout += 1 } static func getCount() -> Int { // 等价于 self.cout、Car.cout cout } } let c0 = Car() let c1 = Car() let c2 = Car() // 3 print(Car.getCount()) ``` #### self * 在实例方法中代表实例 * 在类型方法中代表类型 #### mutating 结构体和枚举是**值类型**,默认情况下,值类型的属性不能被自身的实例方法修改。在 `func` 关键字前加 `mutating` 可以允许这种修改行为。 ```swift struct Point { var x = 0.0, y = 0.0 mutating func moveBy(deltaX: Double, deltaY: Double) { x += deltaX y += deltaY // self = Point(x: x + deltaX, y: y + deltaY) } } enum StateSwitch { case low, middle, high mutating func next() { switch self { case .low: self = .middle case .middle: self = .high case .high: self = .low } } } ``` #### @discardableResult 在 `func` 前面加个 `@discardableResult` ,可以消除:函数调用后返回值未被使用的警告⚠ ```swift struct Point { var x = 0.0, y = 0.0 @discardableResult mutating func moveX(deltaX: Double) -> Double { x += deltaX return x } } var p = Point() p.moveX(deltaX: 10) ```