2012-01-23 22 views
5

मैं उद्देश्य सी में iPhone देव और एक बात के साथ शुरुआत कर मुझे लगता है मैं कर रहा हूँ काफी एक बहुत में और विभिन्न NSArrays से बाहर तैरता (और ints) मिल रहा हैक्या कोई सरणी से फ़्लोट प्राप्त करने का कोई शॉर्टेंड तरीका है?

float myFloatValue = [(NSNumber *)[myArray objectAtIndex:integerSelector] floatValue]; 

मैं समझता हूँ कि मैं जरूरत इस मुक्केबाजी को करने के लिए क्योंकि एक फ्लोट (या int) एक सूचक नहीं है और एनएसएआरएआरई केवल पॉइंटर्स स्वीकार करता है।

मैं सोच रहा हूं कि कोड की इस पंक्ति को कम करने के लिए सिंटैक्टिक चीनी का थोड़ा सा हिस्सा है - अधिकांशतः क्योंकि जब मेरे पास कुछ एरे होते हैं और मैं कुछ प्रसंस्करण करने के लिए उन पर लूप कर रहा हूं तो मुझे लगता है कि लाइनें शुरू होती हैं भारी हो रहा है और मुझे उन रेखाओं को तोड़ना है जो कोड को पठनीय बनाने के लिए सरणी संख्या को निकालने के लिए हैं - फिर मेरे पास बहुत सारी गम्फ लाइनें हैं जो तर्क को पालन करने में कठोर बनाती हैं।

सी # की तरह एक भाषा मैं

float myResult = myArray[i] + someOtherArray[i+1]; 

की तरह कुछ लिखना आरंभ करेगा (ठीक - कि शायद कोड का एक बहुत गूंगा लाइन है - लेकिन वाक्य रचना यह काफी साफ है, मुझे लगता है कि क्योंकि .net परोक्ष जहां बॉक्सिंग कर रही है मैं यह उद्देश्य सीआई में नहीं देख सकते हैं)

पाते हैं अपने आप को लेखन:

float myFloatValue = [(NSNumber *)[myArray objectAtIndex:i] floatValue]; 
float myOtherFloatValue = [(NSNumber *)[someOtherArray objectAtIndex:i+1] floatValue]; 

float myResult = myFloatValue + myOtherFloatValue; 

मैं सिर्फ अगर मैं यह सब बाहर पूरे अक्षरों में लिखावट टाइप करके यहाँ एक चाल याद कर रहा हूँ सोच रहा हूँ। क्या मुझे एनएसएआरएआरई के विकल्प का उपयोग करना चाहिए? क्या मुक्केबाजी/अनबॉक्सिंग के लिए शॉर्टकट है?

या मुझे लगता है, मैं सिर्फ यह करने के लिए इस्तेमाल किया और whinging रोक लेना चाहिए;)

+0

नहीं, उद्देश्य-सी बेकार है। लेकिन यदि आप केवल फ़्लोट्स स्टोर कर रहे हैं तो आप एक सी सरणी का उपयोग कर सकते हैं। सी सरणी के साथ समस्या गतिशील स्मृति आवंटन है। – vakio

+0

ठीक है, कम से कम, आप बिल्कुल क्यों कास्टिंग कर रहे हैं? यह सी ++ नहीं है। आप जो भी संदेश 'आईडी' ऑब्जेक्ट में भेजना चाहते हैं उसे भेज सकते हैं। – StilesCrisis

उत्तर

6

आप एक वर्ग बना सकते हैं: इस प्रकार

@class NSArray (FloatHelper) 

- (float) floatAtIndex:(NSUInteger)i; 

@end 

@implementation NSArray (FloatHelper) 

- (float) floatAtIndex:(NSUInteger)i { 
    return [[self objectAtIndex:i] floatValue]; 
} 

@end 

(untested है और कोई त्रुटि हैंडलिंग, जो, जाहिर है, एक अच्छा विचार नहीं है।)

तो यह किया जा सकता है:

float a = [array floatAtIndex:1]; 
+0

+1 ग्रेट! मैंने उत्तर देने के दौरान इसके बारे में सोचा नहीं है ;-) – EmptyStack

+0

@ स्टीफन: मुझे यकीन नहीं है कि आपके द्वारा यहां पोस्ट किए गए कोड में क्या हो रहा है - उदाहरण के लिए, इस मामले में मेरा ऐरे कहां से आया है? इसके अलावा, केवल बुनियादी चीजें जैसे - इन घोषणाओं को कहां रखा जाए। मैं उद्देश्य सी के साथ एक नौसिखिया हूं और यहां पर्याप्त संदर्भ नहीं मिला है, मुझे नहीं लगता कि आपके पास एक ट्यूटोरियल या दस्तावेज़ीकरण का लिंक है जो मुझे आपके उत्तर को थोड़ा बेहतर समझने में मदद करेगा? –

+1

क्षमा करें, 'myarray' एक कट और पेस्ट त्रुटि थी। यह स्वयं होना चाहिए। दस्तावेज़ीकरण के लिए यहां देखें: http://developer.apple.com/library/ios/#documentation/cocoa/conceptual/objectivec/chapters/occategories.html –

1

दुर्भाग्य से ऑब्जेक्टिव-सी स्वत: मुक्केबाजी समर्थन नहीं करता।

अधिक जानकारी के लिए कृपया लिंक करने के लिए यात्रा के लिए - Aotoboxing in objective c?

0

आप क्यों नहीं बना नहीं है एक मैक्रो,

#define _floatValue(array, index) [(NSNumber *)[array objectAtIndex:index] floatValue] 

यह उपयोग करते हैं,

float myFloatValue = _floatValue(myArray, i); 
float myOtherFloatValue = _floatValue(someOtherArray, i+1); 
float myResult = myFloatValue + myOtherFloatValue; 

और बस परेशान करना बंद करो?

+0

उस मजाकिया लड़के ने मेरा जवाब किसने दिया! नीचे वोट क्यों? क्या मेरा जवाब वास्तव में एक हानिकारक विचार है! मुझे ऐसा नहीं लगता! – EmptyStack

2

मुझे नहीं लगता कि किसी भी आशुलिपि रास्ता

float myFloatValue = [[myArray objectAtIndex:i] floatValue]; 

कानूनी है के द्वारा होती है, है।

1

आप कम वर्बोज कोड के साथ ऐसा करने के लिए एक श्रेणी, एक फ़ंक्शन या मैक्रो बना सकते हैं।

लेकिन यदि आप इसे एक ऐसे लूप में कर रहे हैं जो महत्वपूर्ण CPU समय (जैसे उपकरण के साथ प्रोफाइलिंग द्वारा निर्धारित) का उपभोग करता है, तो आपको इसके बजाय एक सी सरणी का उपयोग करने पर विचार करना चाहिए, जिसे कम CPU चक्रों का उपयोग करके एक्सेस किया जा सकता है, इस प्रकार उपयोगकर्ताओं को संरक्षित किया जा सकता है बैटरी लाइफ। यदि आप एक ही तत्व को कई बार स्पर्श कर रहे हैं, तो यह आपके गणना की लूप करने से पहले इन सभी फ्लोट को एनएसएआरएआरई से फ्लोट की सादा सी सरणी में कॉपी करने का अनुकूलन भी हो सकता है।

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