Junkor

组合条件匹配(Combined pattern-matching)

文章翻译自objc,原文连接:『Combined pattern-matching

假设你想实现一个跟枚举等价的操作符。例如,假设我们想要自己实现一个Optional类型。如果我们自己来实现Optional类型,看看下边不同的分支条件,你可能会这么写:

func ==<A: Equatable>(l: A?, r: A?) -> Bool {
	switch l {
	case .Some(let x):
    	switch r {
    		case .Some(let y): return x == y
    		case .None: return false
    	}
	case .None:
    	switch r {
    		case .None: return true
    		case .Some(_): return false
    	}
	}
}

不管怎样,上边的实现总有一些不必要的代码。为了取代嵌套的switch语句,我们可以简单的把两个条件组合成一个。我们可以用组合条件进行条件匹配,而不是嵌套的匹配语句:

func ==<A: Equatable>(l: A?, r: A?) -> Bool {
	switch (l,r) {
		case let (.Some(x), .Some(y)): return x == y
		case (.None, .None): return true
		default: return false
	}
}

这种实现方式听节省时间,并且代码也更简洁易懂(因为没有嵌套).这个技巧对于解包多个optional类型同样使用。

在上边最后的实现里,代码还有一个小问题。如果有一个新的条件分支要加进来,对于之前的版本,switch没有使用default语句,所以编译器就会直接提醒我们记着处理所有分支,这样挺好的。不过最后的版本就不会有任何提示,因为default会处理掉任何未实现的条件分支。