我做了一个小的“Angular ”枚举,这样我就可以用不同的可互换Angular 格式编程:
enum Angle {
case Radians(CGFloat)
case Degrees(CGFloat)
case Rotations(CGFloat)
}
我发现这种方法有一些冗余的样板代码。例如,我想添加一个计算的var,它只返回原始的底层关联float:
var raw:CGFloat {
switch self {
case let .Radians(value):
return value
case let .Degrees(value):
return value
case let .Rotations(value):
return value
}
}
我试着把它改成:
case .Radians(let value), .Degrees(let value):
return value
我希望它足够聪明,能够意识到它只会解决一个匹配,因此冲突可以忽略。但是没有这样的设备。编译器说它不能解决两个let value
语句之间的冲突。
那么,是不是有一点我还没有发现的习惯上的聪明,这将使我不必在那里重复自己这么多?
另一个类似的例子是当我实现*
函数时:
func * (lhs:Angle, rhs:CGFloat) -> Angle {
switch lhs {
case .Radians:
return .Radians(lhs.raw * rhs)
case .Degrees:
return .Degrees(lhs.raw * rhs)
case .Rotations:
return .Rotations(lhs.raw * rhs)
}
}
似乎应该有一个更简单的表达方式:“使用我的关联值乘以标量参数生成相同的枚举类型”。
- (我不确定我是否有一个好的题目,请随时改进/提出更好的建议)*
3条答案
按热度按时间lnvxswe21#
这是一个有趣的案例:枚举不是正确的数据类型,因为值既不是弧度也不是度,两者都只是Angular ,并不是真正不同的东西。此外,
typealias Radians = Double
也不起作用,因为没有单位安全。也许你可以这样做:
哦,至于你原来问题的答案:不,你不能。
rqcrx0a62#
在较新版本的Swift中,如果值的类型相同,则现在可以执行此操作:
您甚至可以这样做:
tgabmvqs3#
基于@Kametrixom的回应,我最终为这个特殊的“Angular ”建模问题做了如下所示: