我在Swift 中尝试自定义运算符(实验。我不需要关于自定义运算符为什么不好的讲座)我认为,嗯,EnumType(rawValue :)有点长。也许我可以通过运营商解决这个问题?所以我写道:
infix operator ∑
func ∑ <T,U:RawRepresentable>(lhs:T,rhs:U.Type) {
rhs(rawValue: lhs)
}
将按照预期使用此示例:
enum DiceResult: Int {
case one = 1, two, three, four, five, six
}
let roll = 1 ∑ DiceResult //DiceResult.one
但我写的代码给了我这个错误:
非标称类型'U'不支持显式初始化
老实说,我并没有想到我写的是什么工作,而且我甚至不确定类似于我想写的东西在Swift中完全可能。任何人都可以解释一下我是否可以做这样的事情,如果是这样的话,那该怎么办?
答案 0 :(得分:2)
主要错误是您将操作数类型U
,T
视为独立。但左操作数的类型必须是右操作数的RawValue
类型。所以这会编译:
infix operator ∑
func ∑ <U: RawRepresentable>(lhs: U.RawValue, rhs: U.Type) -> U? {
return rhs.init(rawValue: lhs)
}
然后您可以将其用作
enum DiceResult: Int {
case one = 1, two, three, four, five, six
}
let roll = 1 ∑ DiceResult.self
需要 .self
才能将类型作为值访问。
不幸的是,这并不比
let roll = DiceResult(rawValue: 1)