2011-01-08 19 views
7

Neden bu işi kapsamaz:Neden bir anahtar deyiminde bir NSInteger kullanamıyorum?

error: case label does not reduce to an integer constant

o NSInteger en böyle kullanmak mümkün değil mi:

NSInteger sectionLocation = 0; 
NSInteger sectionTitles = 1; 
NSInteger sectionNotifications = 2; 

switch (section) { 
    case sectionLocation: 
     // 
     break; 
    case sectionTitles: 
     // 
     break; 
    case sectionNotifications: 
     // 
     break; 
    default: 
     // 
} 

Bu derleme hatası alıyorum? Öyleyse, değişkenleri anahtar deyiminde kullanmanın başka bir yolu var mı? sectionLocation vb. Değişken değerlere sahiptir.

cevap

10

Sorun, skaler tip değil, ancak durum etiketlerinin, bu gibi değişkenler olduğunda değer değiştirmesi olabilir.

Tüm amaçlarla ve amaçlarla, derleyici bir grup deyim olarak bir anahtar deyimi derler. Etiketler değişken olamaz.

Numaralandırılmış türde veya #defines kullanın.

2

Burada sorun, değişkenleri kullanmanızdır. Sadece anahtar ifadelerinde sabitleri kullanabilirsiniz.

#define SOME_VALUE 1 

veya

enum Values { 
    valuea = 1, 
    valueb = 2, 
    ... 
} 

gibi bir şey yapın Ve siz switch deyimi benzeri DEĞERİa KESİNLİK ve kullanımı mümkün olacak.

+0

Yani if-else-if-else tekrar başvurmak zorunda olacak mı? Bunun etrafında bir yolu yok mu? – Rits

+0

Evet, kullanım tanımlar, bununla ilgili sorun nedir? : D – fresskoma

4

Bunun nedeni, derleyicinin anahtar tablosunu anahtar olarak kullanarak bir 'atlama tablosu' oluşturmak isteyeceği ve yalnızca basit bir tamsayı değerine geçtiğinde bunu yapabilmesidir. Bu yerine çalışmalıdır: davanız değerleri gerçekten zamanında değiştirirseniz

, işte
#define sectionLocation 0 
#define sectionTitles 1 
#define sectionNotifications 2 

int intSection = section; 

switch (intSection) { 
    case sectionLocation: 
     // 
     break; 
    case sectionTitles: 
     // 
     break; 
    case sectionNotifications: 
     // 
     break; 
    default: 
     // 
} 
1

ne olur ... Başka ... Başka yapı için varsa eğer.

-2

ya da sadece bu

switch((int)secion) 
İlgili konular