2015-07-04 14 views
2

我遇到了一個與我的枚舉有關的問題,因爲我想將一個case初始化爲PI/180的double值。有沒有辦法通過一個常量或一些時髦的魔法來獲取這個計算值,並將其轉化爲文字,以便我可以初始化枚舉?如何將計算值轉換爲文字進行枚舉初始化

我不想做一個3.14.... - 我寧願使用這個值的實際編譯器和硬件計算表示。

所以我的第一次嘗試是:

public enum ANGLE_TYPE : Double { 

    case DEGREES = Double(CGFloat(M_PI/180.0)) 
    case RADIANS = 1.0 
} 

我不斷收到對枚舉情況下,錯誤原始值必須是文字

第二次嘗試:

public enum ANGLE_TYPE : Double { 
    let d : Double = Double(CGFloat(M_PI/180.0)) 

case DEGRESS = d 
} 

和我得到相同的錯誤。

有人請告訴我如何去做這件事。

+0

什麼部分關於錯誤你不明白嗎?你不能使用原始值的計算值... – nhgrif

+0

請參閱更新 – Jeef

+1

你知道「literal」是什麼意思嗎?你必須使用文字值。不是一個變量,而不是一個計算值,一個文字值。 – nhgrif

回答

4

您只能使用文字作爲類型支持的枚舉的原始值。

爲了得到這個工作,你算算你執行該文字作爲一種近似計算和粘貼的原始值:

public enum ANGLE_TYPE : Double { 
    case DEGREES = 0.0174532925199433 
    case RADIANS = 1.0 
} 

唯一的其他選擇是有一種支持ENUM和手動提供rawValue屬性:

public enum ANGLE_TYPE { 
    case DEGREES, RADIANS 

    var rawValue: Double { 
     get { 
      switch self { 
      case .DEGREES: 
       return Double(CGFloat(M_PI/180.0)) 
      case .RADIANS: 
       return 1.0 
      } 
     } 
    } 
} 

這可能很有道理,因爲這意味着你沒有init(rawValue:Double)初始化,這不會使整體LO在這種情況下可能有意義。

作爲一個側面說明,這一切帽子的東西是真的不必要的。我更喜歡這樣的東西:

​​