2011-01-08 11 views
7

क्यों नहीं इस काम करता है:मैं स्विच स्टेटमेंट में एनएसआईएनटेगर का उपयोग क्यों नहीं कर सकता?

error: case label does not reduce to an integer constant

यह NSInteger के उपयोग करने के लिए इस तरह संभव नहीं है:

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

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

मैं इस संकलन त्रुटि मिलती है? यदि हां, तो स्विच स्टेटमेंट में मामलों के रूप में चर का उपयोग करने का कोई और तरीका है? sectionLocation आदि परिवर्तनीय मान हैं।

उत्तर

10

समस्या अदिश प्रकार नहीं है, लेकिन मामले लेबल बदल सकते हैं कि जब वे इस तरह चर हैं।

सभी इरादों और उद्देश्यों के लिए, संकलक gotos का एक सेट के रूप में एक स्विच बयान संकलित करता है। लेबल चर नहीं हो सकता है।

एक enumerated प्रकार या #defines का प्रयोग करें।

2

समस्या यहाँ आप चर का उपयोग कर रहे है। आप स्विच कथन में केवल स्थिरांक का उपयोग कर सकते हैं।

#define SOME_VALUE 1 

या

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

की तरह कुछ है और आप अपने स्विच बयान में valuea और इसके आगे का उपयोग करने में सक्षम हो जाएगा।

+0

तो मैं करने के लिए अगर-बाकी-अगर-किसी और फिर सहारा होगा करते हैं? क्या इस के आसपास कोई रास्ता नहीं है? – Rits

+0

हाँ, उपयोग उस के साथ परिभाषित करता है, क्या समस्या? : डी – fresskoma

4

कारण यह है कि संकलक अक्सर एक 'कूद तालिका' है कि तालिका में कुंजी के रूप में स्विच मूल्य का उपयोग कर निर्मित करना चाहेंगे और यह केवल यह है कि अगर यह एक साधारण पूर्णांक मान चालू है कर सकते हैं। यह बजाय काम करना चाहिए:

#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

अपने मामले मूल्यों को सही मायने में कार्यावधि में बदलते हैं, कि क्या करता है, तो ... किसी और यदि किसी और ... अगर निर्माण के लिए नहीं है।

-2

या सिर्फ इस

switch((int)secion) 
संबंधित मुद्दे