有没有办法让Objective-C支持多变量开关构造?

mar*_*wer 16 objective-c switch-statement

我想知道:有没有办法让Objective-C支持多变量switch构造?

我的意思是,我经常需要处理解决方案依赖于一对变量而不是一对变量的问题.对于一长串单变量值,可以使用一个简单的switch/case构造:

switch (var) {
    case 0: ...
    case 1: ...
    default: ...
}
Run Code Online (Sandbox Code Playgroud)

但是当你必须处理两个值的组合时,你经常碰巧做这样的事情:

switch (var1) {
    case 0: 
        switch (var2) {
            case 0: ...
            case 1: ...
        }
    case 1: 
        switch (var2) {
            case 0: ...
            case 1: ...
        }        
    ...
}
Run Code Online (Sandbox Code Playgroud)

它变得越来越复杂......我真正喜欢做的是这样的事情:

switch (var1, var2) {
    case (0,0) : ...
    case (1,0) : ...
    case (*,1) : ...
    default: ...
}
Run Code Online (Sandbox Code Playgroud)

这将导致更简单和可读的结构.有没有解决方案来支持这样的结构?或者这个略有变化?

Int*_*tss 10

我喜欢saphrosit的答案,但我会尽量让它易于理解.

想象一下你的问题的可能结果是网格中的正方形,其中网格边缘的一个边表示var1的值,而另一个边表示var2的可能值,那么如果你逐渐计算出网格的正方形你它能得到这样的东西吗?

      ||                              var1                                   |    
      ||    0    |     1     |     2     | ... |     j     | ... |   n-1     |
======++=====================================================================|
    0 ||    0    |     1     |     2     | ... |     j     | ... |   n-1     |
   ---||---------+-----------+-----------+-----+-----------+-----+-----------|
    1 ||    n    |    n+1    |    n+2    | ... |    n+j    | ... |  n+(n-1)  |
   ---||---------+-----------+-----------+-----+-----------+-----+-----------| 
    2 ||   2*n   |   2*n+1   |  2*n+2    | ... |   2*n+j   | ... | 2*n+(n-1) |
 v ---||---------+-----------+-----------+-----+-----------+-----+-----------|
 a    ||    .    |     .     |     .     |     |     .     |     |  .        |
 r ---||---------+-----------+-----------+-----+-----------+-----+-----------|
 2  i ||   i*n   |   i*n+1   |   i*n+2   | ... |   i*n+j   | ... | i*n+(n-1) |
   ---||---------+-----------+-----------+-----+-----------+-----+-----------|
      ||    .    |      .    |      .    |     |     .     |     |  .        |
  ----||---------+-----------+-----------+-----+-----------+-----+-----------|
  m-1 || (m-1)*n | (m-1)*n+1 | (m-1)*n+2 | ... | (m-1)*n+j | ... |   mn-1    | <-- (m-1)*n+(n-1) = m*n-n + (n-1) = mn-1
------||---------+-----------+-----------+-----+-----------+-----+-----------|
Run Code Online (Sandbox Code Playgroud)

这将被称为行主矩阵,因为您首先计算行数.还有一个列主矩阵,您首先开始倒数而不是开始倒数.这就是矩阵存储在C BLAS库中的方式,因此它应该与许多人非常相似.

在你的情况下,你正在寻找的结果可以解决,因为var3 = var2*n + var1你可以在代码中列出

#define N 10 // Maximum size of var1

int main() {

   int var1 = 1;
   int var2 = 1;

   switch(var1 + var2 * N){
      case 1 + 1 * N: printf("One One"); break;
      case 2 + 2 * N: printf("Two Two"); break;
      default:
      printf("Bada Bing");
   }

   return 0;
}
Run Code Online (Sandbox Code Playgroud)

注意:之前的代码不起作用,这是有效的.