2017-06-06 5 views
2

私はSwiftのカスタム演算子を使って実験しています(実験的にはカスタム演算子が悪い理由について講義する必要はありません)と私は考えていました。少し長い。多分私はこれをオペレータで解決できるだろうか?意図したとおりに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 

しかし、私が書いたコードは、私は、このエラーを与える:

Non-nominal type 'U' does not support explicit initialization

正直なところ、私はしませんでしたとにかく仕事をするために書いたことを期待しています。私が書こうとしているようなことは、スウィフトでも可能です。誰かがこのようなことをすることができるかどうか、もしそうなら、誰かの光を放つことができますか?

答えて

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) 
+0

私は型を定数に割り当てることができるので、これはまだ便利です。 1ΣDICE そして、これは公開コードベースには入っていないと心配しないでください。 – PopKernel

関連する問題