我一直在努力正確實現一個枚舉的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