结构体和枚举是值类型,默认情况下。值类型不能被自身的实例方法修改。
你可以在选在在func关键字前放一个mutating关键字来指定可以修改属性
//: A UIKit based Playground for presenting user interface
import UIKit
struct Point{
var x = 0.0,y = 0.0
mutating func moveBy(x deltaX:Double,y deltaY:Double){
x+=deltaX
y+=deltaY
}
}
var somePoint = Point(x:1.0,y: 1.0)
somePoint.moveBy(x: 2.0, y: 3.0)
print("The point is now at (\(somePoint.x),\(somePoint.y))")
The point is now at (3.0,4.0)
在mutating方法中赋值给self
mutating方法可以指定整个实例给隐含的self属性
//: A UIKit based Playground for presenting user interface
import UIKit
struct Point{
var x = 0.0,y = 0.0
mutating func moveBy(x deltaX:Double,y deltaY:Double){
self = Point(x:x+deltaX,y:y+deltaY)
}
}
var somePoint = Point(x:1.0,y: 1.0)
somePoint.moveBy(x: 2.0, y: 3.0)
print("The point is now at (\(somePoint.x),\(somePoint.y))")
结果同上
枚举的mutating方法
枚举的异变方法可以设置隐含的self属性为相同枚举里的不同成员
//: A UIKit based Playground for presenting user interface
import UIKit
enum TriStaeSwitch{
case off,low,high
mutating func next(){
switch self {
case .off:
self = .low
case .low:
self = .high
case .high:
self = .off
}
}
}
var ovenLight = TriStaeSwitch.low
ovenLight.next()
ovenLight.next()
ovenLight.next()