2012-02-01 3 views
6

मैं कुछ समय के लिए आईओएस प्रोजेक्ट पर काम कर रहा हूं, और मैंने हाल ही में मैक प्रोजेक्ट को कोड पोर्ट करने का निर्णय लिया है। क्योंकि मैंने अपने कोड में एनएसआईएनटेगर का उपयोग करना चुना है, और एनएसआईएनटेगर पर्यावरण-निर्भर टाइपकास्ट है, इसका मतलब है कि आईओएस और मैक ऐप्स पर मेरे चर अलग-अलग प्रकार हैं।उद्देश्य-सी विकास में आईओएस से मैक में जाने पर, एनएसआईएनटेजर्स टाइप मिलान त्रुटियों

जब मैं मैक पर टेस्ट स्वीट चलाने के लिए, अपने सभी STAssertEquals कॉल त्रुटि के साथ विफल "प्रकार बेमेल -" क्योंकि प्रकार मेल नहीं खाते:

NSInteger foo = 1; 
STAssertEquals(foo, 1, nil); // Test fails!! 

मेरी scalars Typecasting काम करने के लिए लगता है, लेकिन यह वास्तव में गन्दा लगता है:

NSInteger foo = 1; 
STAssertEquals(foo, (NSInteger)1, nil); // Succeeds, but is ugly!! 

Am मैं यहाँ कुछ याद आ रही? मुझे संदेह करना शुरू हो रहा है कि एनएसआईएनटेजर्स का उपयोग करने का निर्णय खराब विकल्प था।

अद्यतन: शायद this article संबंधित है। ऐसा लगता है कि टाइपकास्टिंग स्केलर्स का समर्थन करना है।

उत्तर

5

एनएसआईएनटेगर का आपका उपयोग शायद सही विकल्प है, लेकिन इससे STAssertEquals के साथ कुछ समस्याएं उत्पन्न होती हैं।

STAssertEquals विफल रहता है दो वस्तुओं अलग है Objective-C type encodings

एक अकेला 1 एक (हस्ताक्षरित पूर्णांक) के रूप में सी संकलक, एन्कोडिंग "मैं" टाइप है जिसके द्वारा स्वीकार किया जाएगा।

ये मैक्रो भी विफल हो जाएगा:

unsigned u = 1; 
STAssertEquals(u, 1, nil); // Fails because u is type "I" (unsigned int) and 1 is type "i" (int) 

char c = 1; 
STAssertEquals(c, 1, nil); // Fails because c is type "c" (signed char) and 1 is type "i" (signed int) 

संकलक 1 के लिए एक अलग प्रकार का उपयोग करने के लिए आपको (अहस्ताक्षरित लंबे) या 1L के लिए के लिए (अहस्ताक्षरित int) एक प्रत्यय जैसे 1U जोड़ना होगा, 1UL लम्बे समय के लिए)।

एनएसआईएनटेगर को पॉइंटर्स के समान आकार के रूप में परिभाषित किया गया है, जो डिवाइस आर्किटेक्चर पर निर्भर है। 32-बिट मैक ओएस एक्स और आईओएस पर, एनएसआईएनटेगर प्रकार (हस्ताक्षरित int) है, या "i"। 64-बिट मैक ओएस एक्स पर, यह लंबा, या "क्यू" प्रकार है।

इस प्रकार (64-बिट मैक ओएस एक्स एक LP64 वास्तुकला, जिसका अर्थ है कि एल Ongs और पी ointers विस्तृत दोनों -bits हैं), अपने STAssertEquals के बाईं ओर एक "q" है , जबकि दाहिने तरफ "मैं" है, जिससे प्रकार मेल नहीं खाता है।

(NSInteger) 1 लगता है का उपयोग कर सही ढंग से प्रस्तुत करने के लिए क्या आप चाहते हैं की आपका समाधान - मूल्य का एक NSInteger निरंतर खिलाफ एक NSInteger चर का परीक्षण 1.

+0

मैं निम्नलिखित विचार ग्रहण करेंगे होगा लगभग निश्चित रूप से बुरा है, लेकिन मैं समझ मैं पूछता था : क्या एनएसआईएनटेजर्स के रूप में "1" जैसे अवांछित स्केलर का इलाज करने के लिए कंपाइलर को मजबूर करने का कोई तरीका है? –

+1

मुझे विश्वास नहीं है। संकलक एक (लंबे समय तक हस्ताक्षरित) (या लंबे समय तक हस्ताक्षरित) के लिए एक महत्वपूर्ण बड़े पूर्णांक को बढ़ावा देगा, लेकिन मुझे विश्वास नहीं है कि इस व्यवहार को मुफ्त में पाने का एक तरीका है (भले ही वहां था, शायद आप नहीं चाहेंगे ऐसा करने के लिए :)) – iccir

संबंधित मुद्दे