我目前对Swift很新,我想知道以下代码是否可以以任何方式优化/缩短:
enum CardOrientation {
case Horizontal, Vertical
}
func toggleCurrentCardOrientation() {
switch currentCardOrientation {
case .Horizontal: currentCardOrientation = .Vertical
case .Vertical: currentCardOrientation = .Horizontal
}
}
我们假设CardOrientation
总是只有这两个可能的值,并且对toggleCurrentCardOrientation
的每次调用都应该在每个值之间切换。
答案 0 :(得分:7)
两种可能的解决方案:
改用Bool(例如isCardOrientationHorizontal)
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}}成为其中一个测试版的文字。