12.方法

2021-07-19  本文已影响0人  LucXion

方法是与某些特定类型相关联的函数。

self 属性

类型的每一个实例都有一个隐含属性叫做 selfself 完全等同于该实例本身。你可以在一个实例的实例方法中使用这个隐含的 self 属性来引用当前实例。

必须写 self 的场景

  1. 消除歧义:方法参数名称与属性同名
  2. 值类型实例方法内改变 self

实例方法中修改值类型(结构体、枚举)

结构体和枚举是值类型。默认情况下,值类型的属性不能在它的实例方法中被修改。

但是,如果你确实需要在某个特定的方法中修改结构体或者枚举的属性,你可以为这个方法选择 可变(mutating)行为,然后就可以从其方法内部改变它的属性;并且这个方法做的任何改变都会在方法执行结束时写回到原始结构中。方法还可以给它隐含的 self 属性赋予一个全新的实例,这个新实例在方法结束时会替换现存实例。

要使用 可变方法,将关键字 mutating 放到方法的 func 关键字之前就可以了:

enum Lamp:Int {
    case off,on
    mutating func next() {
        switch self {
        case .off:
            self = .on 
        case .on:
            self = .off 
        }
    }
}
var lamp = Lamp.off
lamp.next()
print(lamp)

类方法

实例方法是被某个类型的实例调用的方法。你也可以定义在类型本身上调用的方法,这种方法就叫做类型方法。在方法的 func 关键字之前加上关键字 static,来指定类型方法。类还可以用关键字 class 来指定,从而允许子类重写父类该方法的实现。

在类型方法的方法体(body)中,self 属性指向这个类型本身,而不是类型的某个实例。这意味着你可以用 self 来消除类型属性和类型方法参数之间的歧义(类似于我们在前面处理实例属性和实例方法参数时做的那样)。

struct Game {
    static var hightLv = 1 // 当前游戏最高等级
    var currentLv = 1 //当前用户等级,支持多用户
    // 修改解锁等级
    static func changeHightLv(lv:Int) {
        hightLv = (lv>hightLv) ? lv : hightLv // 类方法中调用类属性,不需要加self
    }
    // 当前等级是否已解锁
    func checkHightLv()->Bool {
        return currentLv <= Game.hightLv // 实例方法中调用类方法需要加类名
    }
    // 是否能进入下个等级
    @discardableResult // 不接收返回值不会报警告
    func advans()->Bool {
        return currentLv + 1 <= Game.hightLv
    }
}
上一篇 下一篇

猜你喜欢

热点阅读