2016-11-02 50 views
4

這是我的枚舉:如何獲得基礎,以枚舉的rawValue它的屬性值 - 斯威夫特

enum Object: Int{ 

    case House1 = 0 
    case House2 = 1 

    var descriptor:String{ 
     switch self{ 
     case .House1: return "Cottage" 
     case .House2: return "House" 
     } 
    } 
} 

我想知道有沒有辦法讓rawValue回來,如果我提供的描述符的價值?

例如,我想知道枚舉值,如果我的字符串是「山寨」 (它應該返回0)

我怎樣才能做到這一點?

回答

4

您可以爲您的枚舉創建一個初始化程序,該程序使用描述符並返回枚舉值,然後調用enumValue.rawValue。請參閱以下內容:

enum Object: Int{ 

    case House1 = 0 
    case House2 = 1 

    var descriptor:String{ 
     switch self{ 
     case .House1: return "Cottage" 
     case .House2: return "House" 
     } 
    } 

    init(descriptor: String) { 
     switch descriptor { 
      case "Cottage": self = .House1 
      case "House": self = .House2 
      default: self = .House1 // Default this to whatever you want 
     } 
    } 
} 

現在做這樣的事情let rawVal = Object(descriptor: "House").rawValue

+0

這正是我需要的 – SteBra

0
enum Object: Int{ 

    case House1 = 0 
    case House2 = 1 

    var description: String { 
     return descriptor 
    } 

    var descriptor:String{ 
     switch self{ 
     case .House1: return "Cottage" 
     case .House2: return "House" 
     } 
    } 

    static func valueFor(string:String) -> Int{ 
     switch string{ 
     case "Cottage": return 0 
     case "House": return 1 
     default: return 2 
     } 
    } 
} 


let obj = Object.House1 

print(obj.description) 
print(obj.rawValue) 
print(Object.valueFor(string: "Cottage") 

//Output 
Cottage 
0 
0 
1

這聽起來像你設計錯誤的對象根據自己的需要。如果那是你想要做的事情,爲什麼你沒有把原始價值變成一個字符串?

enum Object: String { 
    case House1 = "Cottage" 
    case House2 = "House" 
} 

現在你要求的只是作品,開箱即用。

如果您還需要House1以對應0"Cottage"的其他原因,請告訴我們它是什麼。但到目前爲止,從你所說的話來看,這聽起來像你想要的不是一個枚舉。也許一個簡單的數組會更好:

["Cottage", "House"] 

這讓你0"Cottage"之間的直接雙向交換(即索引號)。