实例方法
实例方法是属于某个特定类、结构体或者枚举类型实例的方法。实例方法提供访问和修改实例属性的方法或者提供与实例目的相关的功能,并以此来支撑实例的功能。
下面的例子,定义一个简单的Counter类:
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: 5)
counter.reset()
self属性
类型的每个实例都有一个隐含属性叫做self,self完全等同于该实例本身,可以在一个实例的实例方法中使用这个隐含的self属性来引用当前实例。
func increment() {
self.count += 1
}
实际上,你不必在你的代码里面经常写self。不论何时,只要在一个方法中使用一个已知的属性或者方法名称,如果你没有明确的写self,swift假定你是指当前实例的属性或者方法。这种假定在上面的Counter中已经示范了。
使用这条规则的主要场景是实例方法的某个参数名称与实例的某个属性名称相同的时候。在这种情况下,参数名称享有优先权,并且在引用属性时必须使用一种更严格的方式。这时你可以使用self属性来区分参数名称和属性名称。
struct Point {
var x = 0.0, y = 0.0
func isToTheRightOfX(x:Double) -> Bool {
return self.x > x
}
}
let somePoint = Point(x:4.0,y:5.0)
if somePoint.isToTheRightOfX(x: 1.0){
print("")
}
如果不使用self前缀,swift就认为两次使用的x都指的是名称为x的函数参数。
在实例方法中修改值类型
结构体和枚举是值类型。默认情况下,值类型的属性不能再它的实例方法中被修改。
但是,如果你确实需要在某个特定的方法中修改结构体或者枚举的属性,可以为这个方法选择可变行为,然后可以从其方法内部改变它的属性;并且这个方法做的任何改变都会在方法执行结束时写回到原始结构中。方法还可以给它隐含的self属性赋予一个全新的实例,这个新实例在方法结束时会替换现存实例。
要使用可变方法,将关键字mutating放到方法的func关键字之前就可以了:
struct Point {
var x = 0.0, y = 0.0
mutating func moveByX(deltaX:Double,y deltaY:Double){
x += deltaX
y += deltaY
}
}
var somePoint = Point(x:1.0,y:1.0)
somePoint.moveByX(deltaX: 2.0, y: 3.0)
print("\(somePoint.x)\(somePoint.y)")
上面的Point结构体定义了一个可变方法来移动Point实例到给定的位置。该方法被调用时修改了这个点,而不是返回一个新的点。方法定义时加上了mutating关键字,从而允许修改属性。
在可变方法中给self赋值
可变方法能够赋给隐含属性self一个全新的实例。上面Point的例子可以用下面的方式改写:
struct Point {
var x = 0.0, y = 0.0
mutating func moveByX(deltaX:Double,y deltaY:Double){
self = Point(x:x + deltaX,y:y + deltaY)
}
}
枚举的可变方法可以把self设置为同一枚举类型中不同的成员:
enum TriStateSwitch {
case Off,Low,High
mutating func next(){
switch self{
case .Off:
self = .Low
case .Low:
self = .High
case .High:
self = .Off
}
}
}
上面的例子汇总定义了一个三态开关的枚举。每次调用next()方法时,开关在不同的电源状态之间循环切换。