2015-12-18 15 views
2

我試圖用一個變量的情況下比賽,但是我得到「表情不是Objective-C的整數。使用變量作爲SWICH聲明case常量

是否有可能在交換機中使用變量以這種方式?

int count = [array count]; 

    switch ([number to check]) { 
     case 0: 
      //first statement 
      break; 
     case 1 ... (count -1): 
      //somewhere between 1 and the next to last statement 
      //Basically the middle 
      break; 
     case count: 
      //Last statement 

     default: 
      break; 
    } 

回答

2

的Objective-C(和C)switch只支持每個case語句(如在由TwoStraws回答指出或範圍)的單個原始的恆定值。你會好得多使用if/else編寫代碼:

if ([number to check] == 0) { 
} else if ([number to check] >= 1 && [number to check] < count) { 
} else if ([number to check] == count) { 
} else { 
} 
+0

是啊,我我試圖讓從if語句:-( –

+0

你可以使用斯威夫特,而不是Objective-C的離開我在Swift中不工作,但我知道它有一個更靈活的'switch'語法。 – rmaddy

2

Objective-C的switch語句支持您所看到的值範圍,但不支持變量匹配。

int numberOfKittens = 12; 
NSString *kittenDescription; 

switch (numberOfKittens) { 
    case 0 ... 5: 
     kittenDescription = @"Need more kittens"; 
     break; 

    case 6 ... 10: 
     kittenDescription = @"That's a good number of kittens."; 
     break; 

    case 11 ... 20: 
     kittenDescription = @"Are you sure you can handle that many kittens?"; 
     break; 

    default: 
     kittenDescription = @"You must really love kittens!"; 
} 

...但試圖把一個變量代替任何這些將失敗:

所以,因爲我已經用準確的整數下面的代碼是有效的。

如果這是你非常想要的東西,可以考慮使用Swift,因爲它具有更具表達力的switch匹配系統。下面是斯威夫特同樣的代碼,現在用一個變量用來匹配情況:

let upperLimit = 20 
let numberOfKittens = 19 
var kittenDescription = "" 

switch (numberOfKittens) { 
case 0 ... 5: 
    kittenDescription = "Need more kittens" 

case 6 ... 10: 
    kittenDescription = "That's a good number of kittens." 

case 11 ... upperLimit: 
    kittenDescription = "Are you sure you can handle that many kittens?" 

default: 
    kittenDescription = "You must really love kittens!" 
} 
+2

哇。我已經在Objective-C工作了7年多,並且不知道你可以在'case'中使用範圍。聲明 – rmaddy

+1

這是Clang支持的[GCC擴展](https://gcc.gnu.org/onlinedocs/gcc/Case-Ranges.html),嚴格地說它與Objective-C無關 –

+0

根據您希望您的案例標籤的「變量」是多少,您可以查看預處理器宏。 – rickster