假设我有一个名为Number的类,它有a bool even和a bool big(忽略它们的含义).
我想构建一个函数,它接收2个数字a和b,并为bool的所有可能性做一个不同的事情:
func tooMuchCodeToWrite(a: Number, b: Number){
if(!a.even && !a.big && !b.even && !b.big){
//do something
}
else if(!a.even && !a.big && !b.even && b.big){
//do something
}
else if(!a.even && !a.big && b.even && !b.big){
//do something
}
else if(!a.even && !a.big && b.even && b.big){
//do something
}
// ...
else if(a.even && a.big && b.even && !b.big){
//do something
}
else{ //everyone is true in this case
//do something
}
}
Run Code Online (Sandbox Code Playgroud)
有没有一个技巧或一个美丽的方式来处理这个而不是写所有这些代码?
这种问题的典型解决方案是元组切换:
func tooMuchCodeToWrite(a: Number, b: Number){
switch (a.even, a.big, b.even, b.big) {
case (false, false, false, false): // ...
case (false, false, false, true): // ...
case (false, false, true, false): // ...
...
}
Run Code Online (Sandbox Code Playgroud)
这种方法的好处在于它将检查您是否完全覆盖了所有情况.这种方法的不好的事情是没有什么意义的关于每个true和false,这可能会造成混淆.
这种方法也适用于对常见的"不关心"案件进行分组.例如,如果你总是要做同样的事情,即使a是所有其他值,你可以写:
case (true, _, _, _): // ...
Run Code Online (Sandbox Code Playgroud)
虽然位置依赖仍然令人讨厌,但这有利于非常清楚地表达"不关心这些".
您可以通过这种方式进行更多记录:
switch (aeven: a.even, abig: a.big, beven: b.even, bbig: b.big) {
case (aeven: false, abig: false, beven: false, bbig: true): break
// ...
}
Run Code Online (Sandbox Code Playgroud)
Swift不会强制您添加标签,但如果您添加标签,Swift将确保它们是正确的.这可能会变得非常冗长,所以如果有帮助或有害,这是一种权衡.
| 归档时间: |
|
| 查看次数: |
59 次 |
| 最近记录: |