2017-06-06 94 views
2

我正在Swift中試驗自定義運算符(EXPERIMENTING。我不需要關於自定義運算符爲什麼壞的講座)我想,hmm,EnumType(rawValue :)是有點長。也許我可以用運營商解決這個問題?所以我寫了:從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

老實說,我沒期待我寫的東西,無論如何,我甚至不確定我想寫的東西在Swift中完全可能。是否有人能夠做出這樣的事情,誰能說出一些光明?如果是的話,怎麼樣?

回答

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