2015-11-19 170 views
3

我無法找出訪問枚舉的原始值的語法。下面的代碼應該說明我正在嘗試做什麼。在快速枚舉中訪問值

enum Result<T, U> { 
    case Success(T) 
    case Failure(U) 
} 

struct MyError: ErrorType { 
    var status: Int = 0 
    var message: String = "An undefined error has occured." 

    init(status: Int, message: String) { 
     self.status = status 
     self.message = message 
    } 
} 

let goodResult: Result<String, MyError> = .Success("Some example data") 
let badResult: Result<String, MyError> = .Failure(MyError(status: 401, message: "Unauthorized")) 

var a: String = goodResult //<--- How do I get the string out of here? 
var b: MyError = badResult //<--- How do I get the error out of here? 

回答

8

你可以把它無需switch這樣的:

if case .Success(let str) = goodResult { 
    a = str 
} 
+0

是第二次離開發布相同+1 – Kametrixom

+0

比我的回答更好!忘了你可以匹配那種模式。 –

3

這不是最漂亮的方式,但在操場上玩耍,我能夠使用switchcase以提取值:

switch goodResult { 
    case let .Success(val): 
     print(val) 
    case let .Failure(err): 
     print(err.message) 
} 

編輯
更漂亮的方法是爲返回可選的T和U類型的元組的枚舉編寫方法:

enum Result<T, U> { 
    case Success(T) 
    case Failure(U) 

    func value() -> (T?, U?) { 
     switch self { 
      case let .Success(value): 
       return (value, nil) 

      case let .Failure(value): 
       return (nil, value) 
     } 
    } 
} 
+0

該死的,正要張貼相同。 – luk2302

+0

我仍然必須在消費代碼中進行分支以確定實際上綁定的值是什麼... – 72A12F4E

+0

alex_p的[answer](http://stackoverflow.com/a/33812814/1655180)更簡潔如果你確切知道你想要哪個值,但是如果你想處理這個錯誤,你仍然需要分支。 –