Swift 4.2引入了一种新CaseIterable协议,可自动生成枚举中所有案例的数组属性.
现在我想实现Enum继承的默认方法CaseIterable,可以返回给定案例的下一个案例.如果这种情况是最后一种情况,请返回第一种情况.像一个圆圈.
如果我为特定的Enum写这个,它可以正常工作:
enum Direction: CaseIterable {
case east, south, west, north
func next() -> Direction {
let all = type(of: self).allCases // 1
if self == all.last! {
return all.first!
} else {
let index = all.firstIndex(of: self)!
return all[index + 1]
}
}
}
print(Direction.east.next()) // south
print(Direction.north.next()) // east
Run Code Online (Sandbox Code Playgroud)
但我想对许多Enum实现这个功能.重复复制和粘贴代码并不好(更不用说这个代码对于每个枚举都是完全相同的).
所以我尝试了这个.但出了点问题.
(我建议你将以下代码复制到游乐场,以便更快地理解这个问题):
extension CaseIterable {
func next() -> Self {
let all = type(of: self).allCases // 1
if self == all.last { …Run Code Online (Sandbox Code Playgroud) 我有一个快速的枚举
enum MainState : Int {
case NotStarted
case Init
case AskWhatToText
case RecordWhatToText
}
var state = MainState.NotStarted
Run Code Online (Sandbox Code Playgroud)
并希望做类似的事情
state++
Run Code Online (Sandbox Code Playgroud)
但得到一个错误.建议?