正在获取不带类型的枚举关联值



我想在枚举中添加一个函数,其中self是什么并不重要,只是对关联的值进行操作。

enum ProblemType: CustomStringConvertible {
    case Addition(left: Int, right: Int)
    case Subtraction(left: Int, right: Int)
    case Division(left: Int, right: Int)
    case Multiplication(left: Int, right: Int)
    func doSomething() {
        let left, right = self(left, right) // obviously wrong
    }
}

我知道不同类型之间的关联值可能不同,但当所有类型都相同时,是否可以这样做?

不,您只需要处理所有的案例。但使用一种实用的方法很容易做到这一点:

enum ProblemType {
    case Addition(left: Int, right: Int)
    case Subtraction(left: Int, right: Int)
    case Division(left: Int, right: Int)
    case Multiplication(left: Int, right: Int)
    func leftAndRight() -> (Int,Int) {
        switch self {
        case Addition(let l, let r): return (l,r)
        case Subtraction(let l, let r): return (l,r)
        case Division(let l, let r): return (l,r)
        case Multiplication(let l, let r): return (l,r)
        }
    }
    func doSomething() {
        let (left, right) = self.leftAndRight()
    }
}

关联类型是指附加到特定的案例中,因此没有简单的方法可以做到这一点。也就是说,手动添加该功能并不困难。

enum ProblemType: CustomStringConvertible {
    case Addition(left: Int, right: Int)
    case Subtraction(left: Int, right: Int)
    case Division(left: Int, right: Int)
    case Multiplication(left: Int, right: Int)
    var unwrapProblemType: (left: Int, right: Int) {
        let result: (Int, Int)
        switch self {
        case .Addition(left: let l, right: let r):
            result = (l, r)
        case .Subtraction(left: let l, right: let r):
            result = (l, r)
        case .Division(left: let l, right: let r):
            result = (l, r)
        case .Multiplication(left: let l, right: let r):
            result = (l, r)
        }
        return result
    }
    var description: String {
        let (left, right) = self.unwrapProblemType
        return "Left: (left); Right: (right)"
    }
}

旁注:如果要重复所有左/右信息,最好使用类、结构或协议,而不是枚举。

最新更新