2016-06-07 58 views
2

Swift枚舉有各種各樣的奇蹟,比如初始化,並且你可以編寫一個變異函數,等等。Swift枚舉:在值更改上執行代碼?

但是我想知道,你可以簡單地使用它運行一些代碼,當值變化時

所以,當然使用屬性+枚舉,你可以做到這一點......這是太棒了。

(注意,下面vadian給人正是這樣做的一個很好的完整的例子。)

所以我的問題很簡單,沒有斯威夫特枚舉有一個功能,可以讓你運行代碼每當值改變

或者,總之,您是否必須使用屬性/變量組合?

回答

5

但我想知道如果從字面上在Swift中的枚舉中有一個概念來「值改變時運行代碼」。

編號枚舉是一個值類型。當數值發生變化時,舊數值將被完全破壞並被替換爲新數值。如果你想要可變狀態,你應該使用一個類或可變結構,並且使用一個屬性didSet

+0

說亞倫的值。我明白答案是「不」,謝謝你。然而,幫助我明白你的意思*「枚舉是一種值類型,當值改變時,舊值被完全破壞並被新的替換」* ...發生在任何屬性(這可能確實是一個枚舉)包括值類型的普通情況。當然,運行一些代碼是非常正常的,當一個值類型發生改變時。所以我不確定我是否按照你的意思去推理那裏的「推理」。無論如何,謝謝! – Fattie

+1

把它想象成一個'Int'。如果'var x = 3',當你稍後說'x = 4'時,你不會指望'Int','3'能夠做出反應。 3被簡單地銷燬並被4所取代。從「Int」的角度來看,沒有任何變化。同樣,當你改變枚舉時,'Gate'可能會被銷燬並被'Laps'取代。 –

+0

我想這很有道理。如果你把Int作爲一個財產 - 那是另一回事。這不是那個必須知道的Int 3。 – Fattie

0

聲明RaceState類型的一個實例變量/屬性並改變在觀察者didSet

enum RaceState { case Gate, Laps, Pits } 

class Foo { 

    var raceState : RaceState { 
    didSet { 
     if oldValue != raceState { 
     switchState(raceState) 
     } 
    } 
    } 

    init(state : RaceState) { 
    self.raceState = state 
    switchState(state) 
    } 

    func switchState(state : RaceState) 
    { 
    switch state { 
    case .Gate: 
     engine.sound = false 
     lights.hidden = true 
     score.hidden = true 
     start.hidden = false 
    case .Laps: 
     engine.sound = true 
     lights.hidden = true 
     score.hidden = false 
     start.hidden = false 
    case .Pits: 
     engine.sound = true 
     lights.hidden = false 
     score.hidden = true 
     start.hidden = false 
    } 
    } 
} 
+0

對。感謝您給出一個完整而正確的例子。正如我在問題*中所說的「當然使用屬性+枚舉,你可以做到這一點......這太棒了。」*。我想知道枚舉是否具有在值更改時運行代碼的語法:看起來答案只是「否」! – Fattie

+0

事實上,答案是:沒有 – vadian

+0

對於那個方便的單詞回答,我說一個方便的「謝謝」! :-) – Fattie