我想在枚举中添加一个函数,其中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)"
}
}
旁注:如果要重复所有左/右信息,最好使用类、结构或协议,而不是枚举。