修改值类型的实例方法 mutating

前端之家收集整理的这篇文章主要介绍了修改值类型的实例方法 mutating前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

修改值类型的实例方法

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

然而,如果你需要修改你的结构体或枚举的属性在一个特定的方法中,你可以在这个方法中选择加入变异行为。然后该方法可以变异(即改变)它的属性,任何的更改在方法结束时写回原来的结构里。该方法还可以分配一个新的实例到其隐含的self属性,而这个新的实例将取代现有的实例,当该方法结束时。
你可以加入这个行为,通过将mutating关键字写在方法的func关键字前:
   
   
  1. struct Point {
  2. var x = 0.0,y = 0.0 mutating func moveByX(deltaX: Double,y deltaY: Double) { x += deltaX y += deltaY }
  3. }
  4. var somePoint = Point(x: 1.0,y: 1.0)
  5. somePoint.moveByX(2.0,y: 3.0)
  6. println("The point is now at ((somePoint.x),(somePoint.y))")
  7. // prints "The point is now at (3.0,4.0)"
上面的Point结构体定义了一个变异的moveByX方法,它通过一定量移动一个Point实例。而不是返回一个新的点,这个方法实际上修改了在其上调用的点。mutating关键字添加方法的定义上,使它能够修改它的属性
请注意,你不能使用一个常量的结构类型去调用变异方法,因为它的属性不能被改变。即使它们使可变的属性,如常量结构体实例的存储属性的描述:
let fixedPoint = Point(x: 3.0,255)">fixedPoint.moveByX(2.0,255)">// this will report an error

由变异方法分配self

变异方法可以分配一个全新的实例给隐式的self属性。上面所示的Point例子也可以勇下面的方式来替代:
mutating func moveByX(deltaX: Double,y deltaY: Double) {
  • self = Point(x: x + deltaX,y: y + deltaY)
  • }
  • }
  • moveByX方法的mutating 版本创建了一个全新的结构体,并将x和y的值设置到目标位置。调用这个版本的方法的最终返回结果和调用之前版本的结果完全一样。
    枚举的变异方法可以在同一个枚举里为隐式的self设置不同的值:
    enum TriStateSwitch {
  • case Off,Low,High mutating func next() {
  • switch self {
  • case Off:
  • self = Low
  • case Low:
  • self = High
  • case High:
  • self = Off
  • var ovenLight = TriStateSwitch.Low
  • ovenLight.next()
  • // ovenLight is now equal to .High
  • // ovenLight is now equal to .Off
  • 这个例子定义了一个具有三种状态供选择的枚举。每一次它的next方法调用, 三种不同的电源状态(Off,Low和High)之间循环选择。

    猜你在找的Swift相关文章