दिलचस्प पोस्ट
रंगीन QR कोड उत्पन्न करें जेनेरिक वेब एपीआई नियंत्रक किसी भी मॉडल का समर्थन करने के लिए एन्कोड UTF-8 और युनिकोड के साथ PHP `json_encode` वापस करने का कोई भी तरीका? फ़ंक्शन कॉल पर टाइमआउट json.net: शब्दकोश कुंजी के लिए कनवर्टर निर्दिष्ट करें Html <base> टैग के लिए सिफारिशें क्या हैं? एक छवि का प्रतिनिधित्व करते हुए एक अंडाकार सरणी को रीसामप्लिंग करना अजगर argparse: डिफ़ॉल्ट मान या निर्दिष्ट मूल्य डी 3 एक तत्व के लिए क्लिक करें और खींचें के बीच अंतर करें जिसमें ड्रैग व्यवहार होता है Android में हैंडलर और मेमोरी लीक उद्देश्य-सी: `@ संश्लेषण फूबर;` बनाम “ संश्लेषण करें fooBar = _fooBar; ` एंड्रॉइड मैप्स: लांग कैसे मानचित्र पर क्लिक करें? अपने खुद के एंड्रॉइड ब्लूटूथ ट्रैफ़िक को सूँघने / लॉन्ग करना अपाचे सुअर के साथ पिवट सारणी एक टेक्स्टव्यू में प्रोग्रामेमिक रूप से छोड़ दिया जाने योग्य सेट

उद्देश्य-सी में स्थिर

मैं एक कोको एप्लिकेशन विकसित कर रहा हूं, और मैं निरंतर NSString s का उपयोग कर रहा हूं क्योंकि मेरी प्राथमिकताओं के लिए कुंजी नामों को संग्रहीत करने के तरीके हैं I

मैं समझता हूं कि यह एक अच्छा विचार है, क्योंकि यह आवश्यक होने पर कुंजियों को आसानी से बदलने की अनुमति देता है। इसके अलावा, यह संपूर्ण 'आपके तर्क से आपके डेटा अलग' धारणा है

वैसे भी, क्या एक बार इन अनुप्रयोगों के लिए एक बार स्थिर परिभाषित करने का एक अच्छा तरीका है? मुझे यकीन है कि एक आसान और बुद्धिमान तरीका है, लेकिन अभी मेरी कक्षाएं सिर्फ उन लोगों को फिर से परिभाषित करती हैं जो वे उपयोग करते हैं।

Solutions Collecting From Web of "उद्देश्य-सी में स्थिर"

आपको एक हेडर फाइल बनाना चाहिए जैसे कि

 // Constants.h FOUNDATION_EXPORT NSString *const MyFirstConstant; FOUNDATION_EXPORT NSString *const MySecondConstant; //etc. 

(यदि आप मिश्रित C ​​/ C ++ वातावरण में या अन्य प्लेटफॉर्म्स में आपके कोड का उपयोग नहीं करेंगे, तो आप FOUNDATION_EXPORT बजाय extern उपयोग कर सकते हैं)

आप इस फ़ाइल को प्रत्येक फ़ाइल में शामिल कर सकते हैं जो कि स्थिरांक का उपयोग करता है या प्रोजेक्ट के लिए प्री-कंपाइल किए गए हेडर में।

आप इन स्थिरांकों को एक .m फ़ाइल में परिभाषित करते हैं

 // Constants.m NSString *const MyFirstConstant = @"FirstConstant"; NSString *const MySecondConstant = @"SecondConstant"; 

आपके एप्लिकेशन / फ़्रेमवर्क के लक्ष्य में स्थिरताएं जोड़ दी जानी चाहिए ताकि यह अंतिम उत्पाद में जुड़ा हो।

#define 'd स्थिरांक के बजाय स्ट्रिंग स्थिरांक का उपयोग करने का लाभ यह है कि आप पॉइंटर तुलना ( stringInstance == MyFirstConstant ) का उपयोग करके समानता के लिए परीक्षण कर सकते हैं जो स्ट्रिंग तुलना ( [stringInstance isEqualToString:MyFirstConstant] ) की तुलना में बहुत तेज है (और पढ़ने में आसान है, IMO)।

सबसे आसान उपाय:

 // Prefs.h #define PREFS_MY_CONSTANT @"prefs_my_constant" 

बेहतर तरीका:

 // Prefs.h extern NSString * const PREFS_MY_CONSTANT; // Prefs.m NSString * const PREFS_MY_CONSTANT = @"prefs_my_constant"; 

दूसरे का एक लाभ यह है कि निरंतर के मूल्य को बदलने से आपके पूरे कार्यक्रम का पुनर्निर्माण नहीं होता है

उल्लेख करने के लिए एक बात भी है यदि आपको एक गैर वैश्विक स्थिरांक की आवश्यकता है, तो आपको static कीवर्ड का उपयोग करना चाहिए।

उदाहरण

 // In your *.m file static NSString * const kNSStringConst = @"const value"; 

static कीवर्ड के कारण, यह कॉन्फ़ फाइल के बाहर दिखाई नहीं दे रहा है।


@QuinnTaylor द्वारा मामूली सुधार: स्थिर चर एक संकलन इकाई के भीतर दिखाई दे रहे हैं। आमतौर पर, यह एक एकल। मी फ़ाइल है (जैसा कि इस उदाहरण में है), लेकिन यह आपको काट कर सकता है यदि आप इसे एक हेडर में घोषित करते हैं जो कहीं और शामिल है, क्योंकि आप संकलन के बाद लिंकर त्रुटियां प्राप्त करेंगे

स्वीकृत (और सही) उत्तर कहते हैं कि "आप इस [Constants.h] फ़ाइल को शामिल कर सकते हैं … परियोजना के लिए पूर्व संकलित शीर्षक में।"

नौसिखिए के रूप में, मुझे और स्पष्टीकरण के बिना यह करने में कठिनाई हुई थी – यहां बताया गया है कि: अपने YourAppNameHere-Prefix.pch फ़ाइल में (यह Xcode में precompiled शीर्षलेख के लिए डिफ़ॉल्ट नाम है), #ifdef __OBJC__ ब्लॉक के अंदर अपने Constants.h आयात करें ।

 #ifdef __OBJC__ #import <UIKit/UIKit.h> #import <Foundation/Foundation.h> #import "Constants.h" #endif 

यह भी ध्यान रखें कि Constants.h और Constants.m फ़ाइलों को उन सभी में बिल्कुल और कुछ नहीं होना चाहिए सिवाय इसके कि स्वीकृत उत्तर में वर्णित है। (कोई इंटरफ़ेस या कार्यान्वयन नहीं)

मैं आम तौर पर बैरी वार्क और राहुल गुप्ता द्वारा पोस्ट किए गए तरीके का उपयोग कर रहा हूं।

यद्यपि, मैं दोनों .h और .m फ़ाइल में एक ही शब्द दोहराते नहीं पसंद करता। ध्यान दें, निम्न उदाहरण में लाइन दोनों फाइलों में लगभग समान है:

 // file.h extern NSString* const MyConst; //file.m NSString* const MyConst = @"Lorem ipsum"; 

इसलिए, मुझे कुछ सी प्रीप्रोसेसर मशीनरी का उपयोग करना है। मैं उदाहरण के माध्यम से समझाता हूँ

मेरे पास हैडर फाइल है जो मैक्रो STR_CONST(name, value) परिभाषित करता है:

 // StringConsts.h #ifdef SYNTHESIZE_CONSTS # define STR_CONST(name, value) NSString* const name = @ value #else # define STR_CONST(name, value) extern NSString* const name #endif 

मेरे .h / .m युगल में जहां मैं स्थिर को परिभाषित करना चाहता हूं, मैं निम्नलिखित करता हूं:

 // myfile.h #import <StringConsts.h> STR_CONST(MyConst, "Lorem Ipsum"); STR_CONST(MyOtherConst, "Hello world"); // myfile.m #define SYNTHESIZE_CONSTS #import "myfile.h" 

एट वॉयला, मेरे पास केवल .h फ़ाइल में स्थिरांक के बारे में सारी जानकारी है।

@ क्रैज के सुझाव के एक मामूली संशोधन, ताकि यह ठीक से काम करता है अगर स्थिर शीर्ष लेख पीसीएच में शामिल किया जाए, जो कि सामान्य है। चूंकि मूल पीसीएच में आयात किया जाता है, इसलिए इसे इसे .m फ़ाइल में पुनः लोड नहीं किया जाएगा और इस प्रकार आपको कोई प्रतीकों नहीं मिलेगी और लिंकर नाखुश है।

हालांकि, निम्नलिखित संशोधन इसे काम करने की अनुमति देता है यह थोड़ा जटिल है, लेकिन यह काम करता है

आपको 3 फाइलें, .h फ़ाइल की आवश्यकता होगी, जिसमें लगातार परिभाषाएँ हैं, .h फ़ाइल और .m फ़ाइल, मैं क्रमशः ConstantList.h , Constants.h और Constants.m प्रयोग करेंगे, क्रमशः। Constants.h की सामग्री बस रहे हैं:

 // Constants.h #define STR_CONST(name, value) extern NSString* const name #include "ConstantList.h" 

और Constants.m फ़ाइल दिखता है:

 // Constants.m #ifdef STR_CONST #undef STR_CONST #endif #define STR_CONST(name, value) NSString* const name = @ value #include "ConstantList.h" 

अंत में, ConstantList.h फ़ाइल में वास्तविक घोषणाएं हैं और ये सब है:

 // ConstantList.h STR_CONST(kMyConstant, "Value"); … 

नोट करने के लिए कुछ चीजें:

  1. मैक्रो के इस्तेमाल के लिए #undef बाद #undef .m फ़ाइल में मैक्रो को फिर से परिभाषित करना पड़ा।

  2. इसके लिए #import बजाय मुझे #include का उपयोग करना था और ठीक से काम करने के लिए और पूर्व संकलित मूल्यों को देखते हुए संकलक से बचने के लिए।

  3. जब भी कोई भी मान बदल जाए, तब आपको अपने पीसीएच (और संभवत: पूरी परियोजना) के पुनः कंपाइल की आवश्यकता होगी, जो कि मामला नहीं है अगर वे अलग-अलग (और डुप्लिकेट) सामान्य रूप से हैं

उम्मीद है कि किसी के लिए उपयोगी है

मेरे पास मेरे लिए एक हेडर समर्पित है जिसे निरंतर NSStrings की तरह वरीयताओं के लिए उपयोग किया जाता है:

 extern NSString * const PPRememberMusicList; extern NSString * const PPLoadMusicAtListLoad; extern NSString * const PPAfterPlayingMusic; extern NSString * const PPGotoStartupAfterPlaying; 

फिर उन्हें साथ में। एम फ़ाइल में घोषित करें:

 NSString * const PPRememberMusicList = @"Remember Music List"; NSString * const PPLoadMusicAtListLoad = @"Load music when loading list"; NSString * const PPAfterPlayingMusic = @"After playing music"; NSString * const PPGotoStartupAfterPlaying = @"Go to startup pos. after playing"; 

इस दृष्टिकोण ने मुझे अच्छी तरह से सेवा की है

संपादित करें: ध्यान दें कि यह सबसे अच्छा काम करता है यदि तार एकाधिक फ़ाइलों में उपयोग किया जाता है यदि केवल एक फाइल इस का उपयोग करता है, तो आप बस #define kNSStringConstant @"Constant NSString" को .m फ़ाइल में स्ट्रिंग का उपयोग कर सकते हैं।

 // Prefs.h extern NSString * const RAHUL; // Prefs.m NSString * const RAHUL = @"rahul"; 

जैसा कि अबीज़र ने कहा, आप इसे पीसीएच फ़ाइल में डाल सकते हैं। एक और तरीका है जो इतना गंदे नहीं है कि अपनी सभी चाबियों के लिए एक फ़ाइल शामिल करें और फिर या तो उस फ़ाइल में शामिल करें जो आप में चाबियाँ का उपयोग कर रहे हैं, या, इसे पीसीएच में शामिल करें अपने साथ अपने फाइल में शामिल है, जो कम से कम आपको इन सभी स्थिरों को देखने और परिभाषित करने के लिए एक स्थान देता है।

यदि आप वैश्विक स्थिरांक की तरह कुछ चाहते हैं; एक त्वरित गंदा तरीका है कि pch फाइल में निरंतर घोषणाएं pch

मैं एक सिंगलटन क्लास का उपयोग करता हूं, ताकि मैं कक्षा को नकली कर सकूं और परीक्षण के लिए आवश्यक अगर स्थिरांक बदल सकूँ। स्थिरांक वर्ग इस तरह दिखता है:

 #import <Foundation/Foundation.h> @interface iCode_Framework : NSObject @property (readonly, nonatomic) unsigned int iBufCapacity; @property (readonly, nonatomic) unsigned int iPort; @property (readonly, nonatomic) NSString * urlStr; @end #import "iCode_Framework.h" static iCode_Framework * instance; @implementation iCode_Framework @dynamic iBufCapacity; @dynamic iPort; @dynamic urlStr; - (unsigned int)iBufCapacity { return 1024u; }; - (unsigned int)iPort { return 1978u; }; - (NSString *)urlStr { return @"localhost"; }; + (void)initialize { if (!instance) { instance = [[super allocWithZone:NULL] init]; } } + (id)allocWithZone:(NSZone * const)notUsed { return instance; } @end 

और इसका इस्तेमाल इस तरह किया जाता है (स्थिरांक के लिए लघुकथा का उपयोग ध्यान दें – यह हर बार टाइपिंग [[Constants alloc] init] बचाता है):

 #import "iCode_FrameworkTests.h" #import "iCode_Framework.h" static iCode_Framework * c; // Shorthand @implementation iCode_FrameworkTests + (void)initialize { c = [[iCode_Framework alloc] init]; // Used like normal class; easy to mock! } - (void)testSingleton { STAssertNotNil(c, nil); STAssertEqualObjects(c, [iCode_Framework alloc], nil); STAssertEquals(c.iBufCapacity, 1024u, nil); } @end 

क्लास विधि का उपयोग करने की कोशिश करें:

 +(NSString*)theMainTitle { return @"Hello World"; } 

मैं इसे कभी कभी उपयोग करता हूँ

यदि आप नेमस्पेस निरंतर पसंद करते हैं, तो आप संरचना, शुक्रवार क्यू और एक 2011-08-19 का लाभ उठा सकते हैं : नामस्थान की स्थिरांक और कार्य

 // in the header extern const struct MANotifyingArrayNotificationsStruct { NSString *didAddObject; NSString *didChangeObject; NSString *didRemoveObject; } MANotifyingArrayNotifications; // in the implementation const struct MANotifyingArrayNotificationsStruct MANotifyingArrayNotifications = { .didAddObject = @"didAddObject", .didChangeObject = @"didChangeObject", .didRemoveObject = @"didRemoveObject" };