我一直在努力正确实现一个枚举的ForwardIndexType
协议,尤其是处理最终情况(即没有后继的最后一个项目)。这个协议并没有真正涵盖在Swift语言书中。实现一个枚举ForwardIndexType
下面是一个简单的例子
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
夫特莫名其妙地调用的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
应该能够返回一个可选项,以便能够发信号表示没有特定值的后继者。
有没有人有这个协议更成功?
这吮吸,因为现在我所有的枚举switch语句感染所需的默认情况下, – nielsbot 2015-09-23 02:15:37