【问题标题】:Accessing values in swift enums访问快速枚举中的值
【发布时间】:2015-11-19 19:14:15
【问题描述】:

我无法弄清楚访问枚举原始值的语法。下面的代码应该阐明我想要做什么。

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?

【问题讨论】:

    标签: ios swift enums


    【解决方案1】:

    不用switch 也可以这样:

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

    【讨论】:

    • 距离发布相同的 +1 还差一秒钟
    • 比我的回答好多了!忘了你可以匹配那个模式。
    【解决方案2】:

    这不是最漂亮的方式,但在操场上玩耍时,我能够使用 switch 和 case 提取该值:

    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)
            }
        }
    }
    

    【讨论】:

    • 该死的,只是发布相同的内容。
    • 我仍然需要在消费代码中进行分支以确定实际绑定的值...
    • alex_p 的answer 如果你确切知道你想要哪个值会更简洁,但如果你想处理错误,你仍然需要分支。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-12-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多