參考:[swift之mutating關(guān)鍵字]
(http://blog.csdn.net/tounaobun/article/details/39694233) 來自CSDN
將 PROTOCOL 的方法聲明為 MUTATING 來自王巍
在閱讀iOS8 Swift Programming Cookbook 的時候有個說結(jié)構(gòu)體和類的例子
結(jié)構(gòu)體的例子如下:
import UIKit
struct Person {
var firstName,lastName:String
// mutating 啥意思??
mutating func setFirstNameTo(firstName:String){
self.firstName = firstName
}
}
@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate {
var window: UIWindow?
func changeFirstNameOf(var person:Person,to:String){
person.setFirstNameTo(to)
}
func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
// Override point for customization after application launch.
var vandad = Person(firstName: "Vandad", lastName: "Nahavandipoor")
changeFirstNameOf(vandad, to: "VANDAD")
return true
}
}
我對mutating不懂,就簡單搜了下可以參考下:
http://swifter.tips/protocol-mutation/
并找到了一篇博客,也有對mutating的解釋
在swift中,包含三種類型(type):structure,enumeration,class
其中structure和enumeration是值類型(value type),class是引用類型(reference type)
但是與objective-c不同的是隔显,structure和enumeration也可以擁有方法(method)癌幕,其中方法可以為實例方法(instance method)温自,也可以為類方法(type method)僵控,實例方法是和類型的一個實例綁定的衣厘。
在swift官方教程中有這樣一句話:
“Structures and enumerations are value types. By default, the properties of a value type
cannot be modified from within its instance methods.”
摘錄來自: Apple Inc. “The Swift Programming Language”冬筒。 iBooks. https://itunes.apple.com/WebObjects/MZStore.woa/wa/viewBook?id=881256329
大致意思就是說赘风,雖然結(jié)構(gòu)體和枚舉可以定義自己的方法娇斩,但是默認(rèn)情況下仁卷,實例方法中是不可以修改值類型的屬性。
舉個簡單的例子犬第,假如定義一個點結(jié)構(gòu)體锦积,該結(jié)構(gòu)體有一個修改點位置的實例方法:
struct Point {
var x = 0, y = 0
func moveXBy(x:Int,yBy y:Int) {
self.x += x
// Cannot invoke '+=' with an argument list of type '(Int, Int)'
self.y += y
// Cannot invoke '+=' with an argument list of type '(Int, Int)'
}
}
編譯器拋出錯誤,說明確實不能在實例方法中修改屬性值歉嗓。
為了能夠在實例方法中修改屬性值丰介,可以在方法定義前添加關(guān)鍵字mutating
struct Point {
var x = 0, y = 0
mutating func moveXBy(x:Int,yBy y:Int) {
self.x += x
self.y += y
}
}
var p = Point(x: 5, y: 5)
p.moveXBy(3, yBy: 3)
另外,在值類型的實例方法中鉴分,也可以直接修改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.next()
// ovenLight is now equal to .Off”
TriStateSwitch枚舉定義了一個三個狀態(tài)的開關(guān),在next實例方法中動態(tài)改變self屬性的值志珍。
當(dāng)然橙垢,在引用類型中(即class)中的方法默認(rèn)情況下就可以修改屬性值,不存在以上問題伦糯。
[參考資料: The Swift Programming Language ] from iBook