我一直在努力正确实现 ForwardIndexType
枚举的协议(protocol),特别是最终案例的处理(即没有后继者的最后一项)。 Swift 语言书中并没有真正涵盖该协议(protocol)。
这是一个简单的例子
enum ThreeWords : Int, ForwardIndexType {
case one=1, two, three
func successor() ->ThreeWords {
return ThreeWords(rawValue:self.rawValue + 1)!
}
}
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
Swift 莫名其妙地调用了 successor()
在执行 for 循环中的语句之前,范围结束值的函数。如果范围保持半开 ThreeWords.one..<ThreeWords.three
然后代码正确执行,打印1 2
如果我修改后继函数,使其不会尝试创建大于 .three
的值像这样
func successor() ->ThreeWords {
if self == .three {
return .three
} else {
return ThreeWords(rawValue:self.rawValue + 1)!
}
}
然后 for 循环没有崩溃,但它也错过了最后一次迭代,打印结果就好像范围是半开的一样 1 2
我的结论是swift的for循环迭代有bug;它不应该调用 successor()
在封闭范围的结束值上。其次,ForwardIndexType
应该能够返回一个可选的,能够表明某个值没有后继者。
有没有人在这个协议(protocol)上取得了更大的成功?
最佳答案
关于swift - 实现枚举 ForwardIndexType,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26686982/