2015-11-19 115 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)更简洁如果你确切知道你想要哪个值,但是如果你想处理这个错误,你仍然需要分支。 –