在Swift中交换枚举值

时间:2014-09-22 16:58:08

标签: swift

我目前对Swift很新,我想知道以下代码是否可以以任何方式优化/缩短:

enum CardOrientation {
    case Horizontal, Vertical
}

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

我们假设CardOrientation总是只有这两个可能的值,并且对toggleCurrentCardOrientation的每次调用都应该在每个值之间切换。

4 个答案:

答案 0 :(得分:7)

两种可能的解决方案:

改用Bool(例如isCardOrientationHorizo​​ntal)

Bool极易切换:isCardOrientationHorizontal = !isCardOrientationHorizontal

在枚举中添加切换方法:

enum CardOrientation {
    case Horizontal, Vertical

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

答案 1 :(得分: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

答案 2 :(得分:0)

好吧,你可以在枚举本身上定义swap函数

enum CardOrientation {
    case Horizontal, Vertical

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

并像

一样使用它
func toggleCurrentCardOrientation() {
    currentCardOrientation = currentCardOrientation.swap()
}

作为个人风格笔记,我宁愿不改变实例本身,因为引入可变状态会使代码的推理变得越来越困难。

答案 3 :(得分:0)

在我看来,enum具有固有可翻转性的Bool应具有相同特征的相关原始值。由于enum CardOrientation: Int { case Horizontal = -1, Vertical = 1 mutating func toggle() { self = CardOrientation.fromRaw(-self.toRaw())! } } 不能用作原始类型(你的第一直觉),这个怎么样?

Bool

旁注... true无法使用的原因 - " Raw type' Bool'不可以从任何文字中转换出来 - 可能是一个错误,因为false和{{1}}成为其中一个测试版的文字。