方法(Method)

枚举、结构体、类都可以定义实例方法、类型方法
实例方法(Instance Method):通过实例调用
类型方法(Type Method):通过类型调用,通过static或者class关键字定义

  1. class Car {
  2. /// 类型属性
  3. static var count = 0
  4. init() {
  5. Car.count += 1
  6. }
  7. /// 类型方法
  8. static func getCount() -> Int {
  9. count
  10. }
  11. }
  12. let c0 = Car()
  13. let c1 = Car()
  14. let c2 = Car()
  15. print(Car.getCount()) // 3

通过观察可以看出类型方法里可以访问类型属性,如果将类型属性改为实例属性,就会报错:
image.png
原因是无论实例方法还是类型方法内部都有一个self,在实例方法中代表实例,在类型方法中代表类型,所以在类型方法中不能访问实例属性。
在类型方法static func getCount中,count等价于self.count、Car.self.count、Car.count

mutating

结构体和枚举是值类型,默认情况下,值类型的属性不能被自身的实例方法修改
在func关键字前加mutating可以允许这种修改行为
image.png
添加mutating修饰后,自身的实例方法就可以修改内部值类型属性了

  1. struct Point {
  2. var x: Double = 0
  3. var y: Double = 0
  4. mutating func move(toX: Double, toY: Double) {
  5. x = toX
  6. y = toY
  7. }
  8. }

@discardableResult

当函数调用时,没有使用返回值,就会产生警告
image.png
可以在func前面加个@discardableResult,可以消除:函数调用后返回值未被使用的警告

  1. struct Point {
  2. var x: Double = 0
  3. var y: Double = 0
  4. @discardableResult func test() -> Double {
  5. return x + y
  6. }
  7. }
  8. var p = Point()
  9. p.test()