方法是某些特定类型相关联的函数。类、结构体、枚举都可以定义实例方法,实例方法是为给定类型的实例封装了具体的任务与功能。类、结构体、枚举也可以定义类型方法,类型方法与OC中的类方法类似。
事实上,结构体和枚举可以定义方法是Swift和OC的主要区别。在OC中,类是唯一一种可以定义方法的类型。在Swift中,不仅能选择是否要定义一个类、结构体、枚举,还能灵活的在自定义的类型(类、结构体、枚举)上定义方法。
实例方法(Instance Methods)
实例方法是属于某个特定类、结构体、枚举类型实例的方法。实例方法的语法与函数完全一致:
self属性(The self Property)
每个实例都有一个隐式的属性叫做 self,self 完全等同这个实例本身:
func increment() {
self.count += 1
}
实际上,不必经常写 self,任何时候,只要在一个方法中使用一个已知的属性或者方法名,如果没有明确地写 self ,Swift 假定你是当前实例的属性或方法。
这条规则主要是用来区分实例方法的某个参数名称和这个实例的某个属性名称相同的时候:
在实例方法中修改值类型(Modifying Value Types from Within Instance Methods)
结构体和枚举都是值类型,默认情况下,值类型的属性是不能够在实例方法中修改的。
但是,有些情况下确实需要修改,可以选择可变(mutating)行为,然后就可以在其方法内改变它的属性,并且在方法结束的时候都会把这个方法做的任何改变写回到原始的结构中。方法还可以给 self 属性赋予一个全新的实例,这个新的实例在方法结束时会替换现存实例:
要注意的是,,不能在结构体类型的常量上调用可变方法,因为其属性不能被改变,即使属性是变量属性:
在可变方法中给self赋值(Assigning to self Within a Mutating Method)
可变方法可以给 self 赋一个全新的实例:
类型方法(Type Methods)
类方法在OC中都已经熟悉了,和OC中不同的是,Swift中可以为类、结构体和枚定义类型方法。
class SomeClass {
class func someTypeMethod() {
// type method implementation goes here
}
}
SomeClass.someTypeMethod()
在类型方法中,self 指向这个类型本身,和OC中一样。
下面举一个🌰,定义了一个名为LevelTracker结构体。它监测玩家的游戏发展情况(游戏的不同层次或阶段)。这是一个单人游戏,但也可以存储多个玩家在同一设备上的游戏信息。游戏初始时,所有的游戏等级(除了等级 1)都被锁定。每次有玩家完成一个等级,这个等级就对这个设备上的所有玩家解锁。LevelTracker结构体用类型属性和方法监测游戏的哪个等级已经被解锁。它还监测每个玩家的当前等级: