【发布时间】:2015-11-07 03:04:56
【问题描述】:
我有这个表示颜色的枚举,并且我添加了几种方法来方便地根据原始值的算术运算获得新实例:
enum Color : Int
{
case Red = 0
case Green
case Blue
case Cyan
case Magenta
case Yellow
static func random() -> Color
{
return Color(rawValue: Int(arc4random_uniform(6)))!
}
func shifted(by offset:Int) -> Color
{
return Color(rawValue: (self.rawValue + offset) % 6)!
// Cyclic: wraps around
}
}
(这让人想起旧的枚举只是 int 常量)
问题是,我还有其他几个基于 int 的枚举,我想在其中引入类似的功能,但不重复代码。
我想我应该在RawRepresentable 上定义一个协议扩展,其中RawValue == Int:
extension RawRepresentable where RawValue == Int
{
...但这就是我对语法的理解结束的地方。
理想情况下,我希望需要一个返回案例数量的静态方法,并提供上面考虑到这一点的random() 和shifted(_:) 的默认实现(而不是这里的硬编码6)。
结论:我接受了the answer by Zoff Dino。尽管the answer given by Rob Napier 正是我所要求的,但事实证明我所要求的毕竟不是最优雅的设计,而另一个答案表明了一种更好的方法。不过,我对这两个答案都投了赞成票。谢谢大家。
【问题讨论】:
标签: swift enums protocols rawrepresentable