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


1002

मैं एक कोको आवेदन विकसित कर रहा हूं , और मैं NSStringअपनी प्राथमिकताओं के लिए प्रमुख नामों को संग्रहीत करने के तरीके के रूप में निरंतर उपयोग कर रहा हूं ।

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

वैसे भी, इन स्थिरांक को पूरे अनुप्रयोग के लिए एक बार परिभाषित करने का एक अच्छा तरीका है?

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


7
OOP आपके डेटा को आपके तर्क के साथ समूहीकृत करने के बारे में है। आप जो प्रस्ताव कर रहे हैं वह सिर्फ एक अच्छा प्रोग्रामिंग अभ्यास है, यानी, आपके कार्यक्रम को बदलना आसान है।
रफी खाचदौरेन

जवाबों:


1287

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

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

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

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

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

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

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

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


67
पूर्णांक स्थिरांक के लिए यह होगा: बाहरी int const MyFirstConstant = 1;
डेन मॉर्गन

180
कुल मिलाकर, शानदार जवाब, एक चमकते हुए चेहरे के साथ: आप उद्देश्य-सी में == ऑपरेटर के साथ स्ट्रिंग समानता के लिए परीक्षण नहीं करना चाहते हैं, क्योंकि यह मेमोरी एड्रेस का परीक्षण करता है। इसके लिए हमेशा -isEqualToString का उपयोग करें। आप MyFirstConstant और [NSString stringWithFormat: MyFirstConstant] की तुलना करके आसानी से एक अलग उदाहरण प्राप्त कर सकते हैं। शाब्दिक के साथ, आपके पास एक स्ट्रिंग के किस उदाहरण के बारे में कोई धारणा नहीं है। (किसी भी मामले में, #define एक "पूर्वप्रक्रमक निर्देश" है, और संकलन से पहले प्रतिस्थापित किया जाता है, इसलिए या तो संकलक अंत में एक स्ट्रिंग शाब्दिक देखता है।)
क्विन टेलर

74
इस मामले में, निरंतरता के साथ समानता के लिए परीक्षण करने के लिए == का उपयोग करना ठीक है, अगर यह वास्तव में एक स्थिर प्रतीक के रूप में उपयोग किया जाता है (यानी @ "MyFirstConstant" युक्त स्ट्रिंग के बजाय एक प्रतीक MyFirstConstant का उपयोग किया जाता है)। इस मामले में एक स्ट्रिंग के बजाय एक पूर्णांक का उपयोग किया जा सकता है (वास्तव में, आप जो कर रहे हैं - एक पूर्णांक के रूप में सूचक का उपयोग कर रहे हैं), लेकिन निरंतर स्ट्रिंग का उपयोग करना डिबगिंग को थोड़ा आसान बनाता है क्योंकि निरंतरता के मूल्य का मानव-पठनीय अर्थ है ।
बैरी वार्क

17
+1 के लिए "कॉन्स्टेंट.m को आपके एप्लिकेशन / फ्रेमवर्क के लक्ष्य में जोड़ा जाना चाहिए ताकि यह अंतिम उत्पाद से जुड़ा हो।" मेरी पवित्रता को बचाया। @amok, Constants.m पर "जानकारी प्राप्त करें" और "लक्ष्य" टैब चुनें। सुनिश्चित करें कि यह प्रासंगिक लक्ष्य के लिए जांचा गया है।
PEZ

73
@ बेरी: कोको में, मैंने कई वर्गों को देखा है जो इसके बजाय उनके NSStringगुणों को परिभाषित करते हैं । जैसे, वे (और चाहिए) अपने स्थिर का एक अलग उदाहरण धारण कर सकते हैं , और प्रत्यक्ष स्मृति पता तुलना विफल हो जाएगी। इसके अलावा, मुझे लगता है कि चरित्र की तुलना के रूप में किटी-किरकिरी होने से पहले कोई भी उचित इष्टतम संकेतक सूचक समानता की जांच करेगा। copyretainNSString*-isEqualToString:
बेन मोशर

280

सबसे आसान तरीका:

// 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";

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


12
मुझे लगा कि आप स्थिरांक के मूल्य को बदलने के लिए नहीं थे।
रुइवाचेको

71
एंड्रयू कोडिंग करते समय निरंतरता के मूल्य को बदलने का उल्लेख कर रहा है, न कि जब अनुप्रयोग चल रहा है।
रान्डेल

7
क्या ऐसा करने में कोई अतिरिक्त मूल्य है extern NSString const * const MyConstant, अर्थात, यह एक स्थिर सूचक के बजाय एक स्थिर वस्तु को एक स्थिर सूचक बनाता है?
हरि करम सिंह

4
क्या होगा, अगर मैं हेडर फ़ाइल में इस घोषणा का उपयोग करता हूं, स्थिर NSString * const kNSStringConst = @ "const value"; .H और .m फ़ाइलों में अलग से घोषित न करने और init के बीच अंतर क्या है?
करीम

4
@ डॉगवेदर - कोई ऐसा स्थान जहाँ केवल कंपाइलर को उत्तर पता हो। IE, यदि आप एक मेनू के बारे में शामिल करना चाहते थे जो संकलक का उपयोग किसी एप्लिकेशन के निर्माण को संकलित करने के लिए किया गया था, तो आप इसे संकलित कोड के बाद से वहां रख सकते हैं अन्यथा किसी भी तरह से जानने की जरूरत नहीं होगी। मैं कई अन्य स्थानों के बारे में नहीं सोच सकता। मैक्रोज़ निश्चित रूप से कई स्थानों पर उपयोग नहीं किया जाना चाहिए। क्या होगा अगर मेरे पास #define MY_CONST 5 और कहीं और #define MY_CONST_2 25 हो। नतीजा यह है कि आप एक संकलक त्रुटि के साथ बहुत अच्छी तरह से समाप्त हो सकते हैं जब यह 5_2 संकलित करने का प्रयास करता है। स्थिरांक के लिए # डिफाइन का उपयोग न करें। स्थिरांक का उपयोग करें।
ArtOfWarfare

190

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

उदाहरण

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

की वजह से staticकीवर्ड, इस स्थिरांक फ़ाइल के दृश्य के बाहर नहीं है।


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


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

यदि मैं स्थैतिक कीवर्ड का उपयोग नहीं करता हूं, तो क्या kNSStringConst पूरे प्रोजेक्ट में उपलब्ध होगा?
डेनियल आयटेकिन

2
ठीक है, बस जाँच की गई ... यदि आप स्थैतिक को छोड़ देते हैं, तो Xcode अन्य फ़ाइलों में इसके लिए स्वत: पूर्णता प्रदान नहीं करता है, लेकिन मैंने दो अलग-अलग स्थानों में एक ही नाम डालने की कोशिश की, और क्विन की लिंकर त्रुटियों को पुन: उत्पन्न किया।
डेनियल आयटेकिन

1
हेडर फ़ाइल में स्थैतिक लिंकर समस्याएँ नहीं देता है। हालाँकि, शीर्ष लेख फ़ाइल सहित प्रत्येक संकलन इकाई को अपना स्वयं का स्थिर वैरिएबल मिलेगा, इसलिए यदि आप शीर्ष लेख को 100 मीटर की फ़ाइलों में शामिल करते हैं तो आपको उनमें से 100 मिलेंगे।
gnasher729

@kompozer .m फ़ाइल के किस भाग में आप इसे रखते हैं?
तुलसी बॉर्क

117

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

नौसिखिए के रूप में, मुझे आगे की व्याख्या के बिना ऐसा करने में कठिनाई हुई - यहाँ बताया गया है: आपकी YourAppNameHere-Prefix.pch फ़ाइल में (यह Xcode में पहले से तैयार हेडर के लिए डिफ़ॉल्ट नाम है), अपने Constants.b को #ifdef __OBJC__ब्लॉक के अंदर आयात करें ।

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

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


मैंने ऐसा किया था, लेकिन कुछ फ़ाइलों ने संकलित "अघोषित पहचानकर्ता का उपयोग 'CONSTANTSNAME' संकलित करने पर त्रुटि फेंक दी। यदि मैं निरंतरता को फेंकने वाली फ़ाइल में शामिल करता हूं, तो यह काम करता है, लेकिन यह वह नहीं है जो मैं करना चाहता हूं। मैंने साफ, शटडाउन किया है। एक्सकोड और निर्माण और अभी भी समस्याएं ... किसी भी विचार?
J3RM

50

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

हालाँकि, मुझे .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"

et voila, मुझे केवल .h फ़ाइल में स्थिरांक के बारे में सारी जानकारी है।


हम्म, वहाँ एक चेतावनी का एक सा है, हालांकि, आप इस तकनीक का उपयोग इस तरह से नहीं कर सकते हैं यदि हेडर फ़ाइल को प्री-कैप्ड हेडर में आयात किया जाता है, क्योंकि यह .m फ़ाइल को .m फ़ाइल में लोड नहीं करेगा क्योंकि यह पहले से ही संकलित था। हालांकि इसका एक तरीका है - मेरा उत्तर देखें (क्योंकि मैं टिप्पणियों में अच्छा कोड नहीं डाल सकता हूं।
स्कॉट लिटिल

मैं यह काम नहीं कर सकता। अगर मैं #import "myfile.h" से पहले #define SYNTHESIZE_CONSTS डालता हूं तो यह NSString * करता है ... .h और .m दोनों में (सहायक दृश्य और प्रीप्रोसेसर का उपयोग करके जांचा जाता है)। यह पुनर्निर्धारण त्रुटियों को फेंकता है। अगर मैं इसे #import "myfile.h" के बाद डालता हूं, तो यह दोनों फाइलों में NSString * ... को एक्सटर्नल करता है। फिर यह "अपरिभाषित प्रतीक" त्रुटियों को फेंकता है।
आर्सेनियस

28

मेरे पास खुद एक ऐसा हेडर है जो वरीयताओं के लिए उपयोग किए जाने वाले निरंतर एनएसएसट्रेस को घोषित करने के लिए समर्पित है:

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

फिर उन्हें .m फ़ाइल में घोषित करना:

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 फ़ाइल में कर सकते हैं ।


25

@Krizz के सुझाव का एक मामूली संशोधन, ताकि यह ठीक से काम करे अगर कॉन्स्टेंट हेडर फ़ाइल को PCH में शामिल किया जाए, जो सामान्य है। चूंकि मूल को PCH में आयात किया जाता है, इसलिए यह इसे पुनः लोड नहीं करेगा.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. में मैक्रो को फिर से परिभाषित करना था .m मैक्रो का उपयोग करने के लिए आईएनजी के बाद फाइल#undef

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

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

आशा है कि किसी के लिए उपयोगी है।


1
# किंकर्तव्यविमूढ़ता ने मेरे लिए इस सिरदर्द को ठीक कर दिया।
रामसेल

स्वीकृत उत्तर की तुलना में क्या इससे कोई प्रदर्शन / स्मृति हानि होती है?
ग्याफिस

स्वीकृत उत्तर की तुलना में प्रदर्शन के जवाब में, कोई नहीं है। यह प्रभावी रूप से संकलक के दृष्टिकोण से सटीक एक ही बात है। आप एक ही घोषणा के साथ समाप्त होते हैं। यदि आप externउपरोक्त को उसी के साथ प्रतिस्थापित करते हैं तो वे बिल्कुल समान होंगे FOUNDATION_EXPORT
स्कॉट लिटिल


12

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


11

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


7
.Pch का संपादन आमतौर पर सबसे अच्छा विचार नहीं है। आपको वास्तव में चर को परिभाषित करने के लिए एक जगह ढूंढनी होगी, लगभग हमेशा एक .m फ़ाइल, इसलिए यह मिलान .h फ़ाइल में घोषित करने के लिए अधिक समझ में आता है । कॉन्स्टेंट.एच / एम पेयर बनाने का स्वीकृत उत्तर एक अच्छा है यदि आपको पूरे प्रोजेक्ट में उनकी आवश्यकता है। मैं आमतौर पर स्थिरांक को यथासंभव नीचे रखता हूं, जहां वे उपयोग किए जाएंगे।
क्विन टेलर

8

कक्षा विधि का उपयोग करके देखें:

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

मैं कभी-कभी इसका इस्तेमाल करता हूं।


6
एक वर्ग विधि एक स्थिर नहीं है। रन समय में इसकी लागत होती है, और हमेशा एक ही वस्तु वापस नहीं हो सकती है (यदि आप इसे उसी तरह से लागू करेंगे, लेकिन आपने जरूरी नहीं कि इसे इस तरह से लागू किया है), जिसका अर्थ है कि आपको isEqualToString:तुलना के लिए उपयोग करना होगा, जो है रन समय में एक और लागत। जब आप स्थिरांक चाहते हैं, तो स्थिरांक बनाएं।
पीटर होसी

2
@Peter होसी, जबकि आपकी टिप्पणियां सही हैं, हम उस प्रदर्शन को LOC के अनुसार एक बार या उससे अधिक "उच्च-स्तरीय" भाषाओं में मारते हैं, जैसे रूबी जैसी हर चिंता के बिना। मैं यह नहीं कह रहा हूँ कि आप सही नहीं हैं, बल्कि केवल इस बात पर टिप्पणी कर रहे हैं कि अलग-अलग "दुनिया" में मानक कैसे भिन्न हैं।
डैन रोसेनस्टार्क

1
रूबी पर सच। अधिकांश प्रदर्शन लोगों के लिए कोड विशिष्ट एप्लिकेशन के लिए काफी अनावश्यक है।
पीटर डेविस

8

यदि आपको नामस्थान स्थिर पसंद है, तो आप संरचना का लाभ उठा सकते हैं, शुक्रवार Q & A 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"
};

1
बड़ी अच्छी बात है! लेकिन एआरसी के तहत आपको __unsafe_unretainedकाम करने के लिए क्वालिफायर के साथ स्ट्रक्चर डिक्लेरेशन में सभी वेरिएबल को प्रीफिक्स करना होगा।
सीमेन

7

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

#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

और इसका उपयोग इस तरह किया जाता है (ध्यान दें कि स्थिरांक के लिए शॉर्टहैंड का उपयोग c - यह [[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

1

यदि आप NSString.newLine;ऑब्जेक्टिव c से कुछ इस तरह से कॉल करना चाहते हैं , और आप चाहते हैं कि यह स्थिर हो, तो आप कुछ इस तरह से तेजी से बना सकते हैं:

public extension NSString {
    @objc public static let newLine = "\n"
}

और आपके पास अच्छा पठनीय निरंतर परिभाषा है, और अपनी पसंद के प्रकार के भीतर से उपलब्ध है, जबकि स्टाइल प्रकार के संदर्भ में बंधी हुई है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.