2014-09-22 62 views
1

我目前很新的雨燕,我想知道,如果下面的代碼可以被優化/縮短以任何方式:交換枚舉值斯威夫特

enum CardOrientation { 
    case Horizontal, Vertical 
} 

func toggleCurrentCardOrientation() { 
    switch currentCardOrientation { 
    case .Horizontal: currentCardOrientation = .Vertical 
    case .Vertical: currentCardOrientation = .Horizontal 
    } 
} 

讓我們假設CardOrientation將永遠只是有這些兩個可能的值和每個呼叫toggleCurrentCardOrientation都應該在每個值之間切換。

回答

4

兩個可能的解決方案:

使用布爾代替(如isCardOrientationHorizo​​ntal)

BOOLS都極爲方便切換:isCardOrientationHorizontal = !isCardOrientationHorizontal

添加一個切換到你的枚舉的方法:

enum CardOrientation { 
    case Horizontal, Vertical 

    mutating func toggle() { 
     switch self { 
      case .Horizontal: 
       self = .Vertical 
      case .Vertical: 
       self = .Horizontal 
     } 
    } 
} 
+0

+1提供兩種不同的方法。起初我正在考慮使用Bool,但我總覺得能夠使用令人敬畏的「.Vertical」語法,這使得它更加明顯地發生了什麼。 – BastiBen 2014-09-22 17:13:39

1

我會將切換方法移到枚舉本身。然後將該方法標記爲mutating以通過更新自身來祝福它。考慮到只有兩個選項,switch看起來像是過度殺傷。您只能使用if/else。但如果你有兩個以上的選項,switch更有意義。

例如:

enum CardOrientation { 
    case Horizontal, Vertical 
    mutating func toggle() { 
     if self == .Horizontal { 
      self = .Vertical 
     } else { 
      self = .Horizontal 
     } 
    } 
} 

var currentCardOrientation: CardOrientation = .Horizontal 
currentCardOrientation.toggle() 
currentCardOrientation // .Vertical 
currentCardOrientation.toggle() 
currentCardOrientation // .Horizontal 
+0

我會說,如果他在將來增加另一個案例時,開關優於if語句。將編譯器作爲安全網,以確保所有案例都被考慮在內是最好的。 – drewag 2014-09-22 17:05:40

+0

你可能是對的。 – 2014-09-22 17:06:25

+0

@drewag,一般來說這是真的,但如果使用「切換」功能,超過兩個就沒什麼意義了。 – 2014-09-22 17:06:48

0

好了,你可以定義枚舉本身

enum CardOrientation { 
    case Horizontal, Vertical 

    func swap() -> CardOrientation { 
     switch(self) { 
     case Horizontal: return Vertical 
     case Vertical: return Horizontal 
     } 
    } 
} 

swap功能,並使用它像

func toggleCurrentCardOrientation() { 
    currentCardOrientation = currentCardOrientation.swap() 
} 

作爲個人風格而言,我寧願不變異的實例本身,因爲引入可變狀態使代碼的推理越來越困難。

0

在我看來,本質上可翻轉的enum應該有相同的原始值與同樣的特質。由於Bool不能用作原始類型(你的第一本能),這個怎麼樣?

enum CardOrientation: Int { 
    case Horizontal = -1, Vertical = 1 

    mutating func toggle() { 
     self = CardOrientation.fromRaw(-self.toRaw())! 
    } 
} 

在一個側面說明...對於Bool不能夠用作以下用途─原因「原始類型‘布爾’是不可自由兌換的任何文字」 -might是因爲truefalse成了文字中的錯誤其中一個測試版。