实现枚举ForwardIndexType

Guy*_*ker 9 enums swift

我一直在努力ForwardIndexType为枚举正确实现协议,特别是最终案例的处理(即没有后继的最后一项).Swift语言书中没有涵盖这个协议.

这是一个简单的例子

enum ThreeWords : Int, ForwardIndexType {
    case one=1, two, three

    func successor() ->ThreeWords {
            return ThreeWords(rawValue:self.rawValue + 1)!
    }
}
Run Code Online (Sandbox Code Playgroud)

successor()函数将返回下一个枚举器值,但最后一个元素除外,它将因异常而失败,因为之后没有值.three

ForwardTypeProtocol不允许successor()返回一个条件值,所以似乎没有信号,没有继任者的方式.

现在在for循环中使用它来迭代枚举的所有可能值的闭合范围,对于最终情况会遇到问题:

for word in ThreeWords.one...ThreeWords.three {
    print("   \(word.rawValue)")
}
println()

//Crashes with the error:

fatal error: unexpectedly found nil while unwrapping an Optional value
Run Code Online (Sandbox Code Playgroud)

successor()在执行for循环中的语句之前,Swift莫名其妙地调用范围的结束值的函数.如果范围保持半开,ThreeWords.one..<ThreeWords.three则代码正确执行,打印1 2

如果我修改后继函数,以便它不会尝试创建大于.three这个值的值

   func successor() ->ThreeWords {
        if self == .three {
            return .three
        } else {
            return ThreeWords(rawValue:self.rawValue + 1)!
        }
    }
Run Code Online (Sandbox Code Playgroud)

然后for循环不会崩溃,但它也会错过最后一次迭代,打印时就好像范围是半开的一样 1 2

我的结论是swift的循环迭代中存在一个错误; 它不应该调用successor()封闭范围的最终值.其次,ForwardIndexType应该能够返回一个可选的,以便能够发出某个值没有继承者的信号.

有没有人在这个协议上取得更多成功?

jtb*_*des 2

事实上,似乎successor将根据最后一个值进行调用。

您可能希望提交一个 bug,但要解决这个问题,您可以简单地添加一个哨兵值来充当后继者。