轉(zhuǎn)載
在Swift中察绷,包含三種類型(type): structure,enumeration,class
其中structure和enumeration是值類型(value type),class是引用類型(reference type)
但是與objective-c不同的是孙蒙,structure和enumeration也可以擁有方法(method),其中方法可以為實例方法(instance method),也可以為類方法(type method),實例方法是和類型的一個實例綁定的。
在swift官方教程中有這樣一句話:
[plain] view plain copy 在CODE上查看代碼片派生到我的代碼片
“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)體和枚舉可以定義自己的方法埋凯,但是默認情況下点楼,實例方法中是不可以修改值類型的屬性。
舉個簡單的例子递鹉,假如定義一個點結(jié)構(gòu)體盟步,該結(jié)構(gòu)體有一個修改點位置的實例方法:
[plain] view plain copy 在CODE上查看代碼片派生到我的代碼片
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
[plain] view plain copy 在CODE上查看代碼片派生到我的代碼片
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屬性值黄橘。
[plain] view plain copy 在CODE上查看代碼片派生到我的代碼片
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屬性的值屈溉。
當然塞关,在引用類型中(即class)中的方法默認情況下就可以修改屬性值,不存在以上問題子巾。