从rawValue

时间:2017-06-06 14:16:25

标签: swift generics

我在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中完全可能。任何人都可以解释一下我是否可以做这样的事情,如果是这样的话,那该怎么办?

1 个答案:

答案 0 :(得分:2)

主要错误是您将操作数类型UT视为独立。但左操作数的类型必须是右操作数的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)