2015-04-15 61 views
1

編輯委派非failable初始化到failable初始化

一個簡單的解決方案,發現由於@Airspeed速度,添加了,因爲這是從JSON解析有點扭曲。允許初始化採取AnyObject?並默認爲Unknown(或Invalid):

init(value: AnyObject?) { 
    if let value = value as? Int 
    ,let result = Result(rawValue: value) { 
     self = result 
    } else { 
    self = .Unknown 
    } 
} 

//

原始

我實現了一個枚舉了Unknown情況:

enum Result: Int { 
    case Success 
    case Failure 
    case Foo 
    case Bar 
    case FooBar 
    case FooFoo 
    ... 
    case Unknown = -1 
} 

我想創建另一個初始化程序,需要ñInt並返回Unknown的情況下,不被認可的枚舉:

init(value: Int) { 
    self.init(rawValue: value) 
    if self == nil { // Complication Error 
    self = .Unknown 
    } 
} 

我現在的解決方案是一個工廠方法,但是一個初始化會更清潔:

​​

回答

3

雖然你不能委派到failable初始值設定項,因爲枚舉是值類型,您可以嘗試使用failable初始值設定項創建另一個相同枚舉值,然後在nil的情況下替換默認值,並將其分配給self

enum Result: Int { 
    case Success 
    case Failure 
    case Unknown = -1 

    init(value: Int) { 
     self = Result(rawValue: value) ?? .Unknown 
    } 
} 

Result(value: 100) == .Unknown // returns true 
+0

謝謝!我很尷尬,我不認爲在初始化器中使用類型名稱。 – Yariv