2014-10-18 162 views
12

我使用的Xcode 6遊樂場嘗試枚舉在斯威夫特:枚舉的rawValue財產無法識別

enum Rank: String 
{ 
    case One = "One", Two="Two" 

    init(rawValue : String) 
    { 
     self.rawValue = rawValue 
    } 
} 

我要重寫的init使枚舉可以初始化使用它rawValue作爲參數。但是,我得到一個錯誤:

enter image description here

但根據Apple's Swift guide我的代碼應該是正確的。

回答

10

馬丁的回答是完全正確的。

這是一個更直接回答你的問題的不同觀點。

在Xcode 6.0中,enum沒有rawValue屬性。 rawValue已添加到Xcode 6.1中,但請注意它是一個只讀計算屬性,因此您無法在Xcode 6.1中指定它。

在Xcode 6.1中,沒有必要實現一個採用rawValue的初始化程序,因爲它已經由該語言本地提供。如果你試圖模仿在Xcode 6.0的行爲,那麼你可以嘗試這樣的:

enum Rank: String 
{ 
    case One = "One", Two="Two" 

    init(rawValue : String) 
    { 
     self = Rank.fromRaw(rawValue) 
    } 
} 

但這個問題是fromRaw返回一個可選的枚舉值,因爲rawValue字符串可能對應於任何枚舉值。

那麼你現在在做什麼?你可以添加一個!強制解開值:

self = Rank.fromRaw(rawValue)! 

,但如果你想創建一個無效的原始值的枚舉,這將崩潰。

你可以把枚舉值中的一個作爲默認和使用零合併運算??安全解開它:

self = Rank.fromRaw(rawValue) ?? One 

這將避免崩潰,但可能會導致意外你的程序部分的行爲。

你不能在Xcode 6.0中做的是init返回一個可選值。這個功能是在Xcode 6中添加的。1,正是這種新功能允許他們將fromRaw()從Xcode 6.0中的函數更改爲Xcode 6.1中的可選初始化函數。

14

枚舉及其原始值之間的轉換方法在Xcode 6.0 和Xcode 6.1之間改變。該fromRaw()toRaw()方法已被取代 一(failable)初始化和rawValue屬性:

的Xcode 6.0:

// raw value to enum: 
if let rank = Rank.fromRaw("One") { } 

// enum to raw value: 
let str = rank.toRaw() 

的Xcode 6.1:

// raw value to enum: 
if let rank = Rank(rawValue: "One") { } 

// enum to raw value: 
let str = rank.rawValue 
+0

你知道是否支持正常/不可分解的初始值設定項,或者只是破壞了嗎? http://stackoverflow.com/questions/28653484/swift-enums-normal-non-failable-initializers-not-supported-or-just-broken?謝謝-c – 2015-02-22 01:33:49

+1

檢查Xcode 7.0(測試版3)和'Rank(rawValue:「One」)'正確初始化枚舉成員... – Zorayr 2015-07-27 00:31:50