पहला प्रश्न यह है कि आप अपने स्थिरांक को किस दायरे में रखना चाहते हैं, जो वास्तव में दो प्रश्न हैं:
- क्या ये स्थिरांक एक एकल वर्ग के लिए विशिष्ट हैं, या क्या यह समझ में नहीं आता है कि ये सभी अनुप्रयोग में हैं?
- यदि वे वर्ग-विशिष्ट हैं, तो क्या वे कक्षा के ग्राहकों द्वारा उपयोग किए जाते हैं, या केवल कक्षा के भीतर ही हैं?
यदि वे एकल वर्ग के लिए विशिष्ट और आंतरिक हैं, तो उन्हें static const
.m फ़ाइल के शीर्ष पर घोषित करें , जैसे:
static NSString *const MyThingNotificationKey = @"MyThingNotificationKey";
यदि वे एक ही वर्ग से संबंधित हैं, लेकिन सार्वजनिक / अन्य वर्गों द्वारा उपयोग किया जाना चाहिए, उन्हें extern
हेडर के रूप में घोषित करें और उन्हें परिभाषित करें:
//.h
extern NSString *const MyThingNotificationKey;
//.m
NSString *const MyThingNotificationKey = @"MyThingNotificationKey";
यदि उन्हें वैश्विक होना चाहिए, तो उन्हें हेडर में घोषित करें और उन्हें उसी मॉड्यूल में परिभाषित करें, विशेष रूप से उन स्थिरांक के लिए।
आप अलग-अलग स्तरों के लिए इनका मिश्रण कर सकते हैं और अलग-अलग स्तरों के साथ जोड़ सकते हैं कि आप उन्हें कितना वैश्विक चाहते हैं, और विभिन्न वैश्विक स्थिरांक जो केवल एक साथ नहीं हैं - आप उन्हें अलग-अलग मॉड्यूल में रख सकते हैं, प्रत्येक अपने स्वयं के हेडर के साथ, यदि आप चाहते हैं।
क्यों नहीं #define
?
पुराना उत्तर है "मैक्रोज़ के पास टाइप की जानकारी नहीं है", लेकिन कंपाइलर्स आज सभी प्रकार के चेक-इन शाब्दिक (मैक्रोज़ का विस्तार) के साथ-साथ चर के बारे में बहुत स्मार्ट हैं।
आधुनिक उत्तर इसलिए है क्योंकि डिबगर को आपके मैक्रोज़ के बारे में पता नहीं होगा। यदि आप एक मैक्रो है [myThing addObserver:self forKey:MyThingNotificationKey]
तो आप डिबगर कमांड में नहीं कह सकते MyThingNotificationKey
; डीबगर केवल इसके बारे में जान सकता है यदि यह एक चर है।
क्यों नहीं enum
?
खैर, असभ्य ने मुझे टिप्पणियों में इसे हराया: enum
केवल पूर्णांक स्थिरांक को परिभाषित कर सकता है। सीरियल पहचानकर्ता संख्या, बिट-मास्क, चार-बाइट कोड आदि जैसी चीजें।
उन उद्देश्यों के लिए, enum
महान है और आपको इसका पूरा उपयोग करना चाहिए। (इससे भी बेहतर, और मैक्रोज़ का उपयोग करेंNS_ENUM
NS_OPTIONS
।) अन्य चीजों के लिए, आपको कुछ और उपयोग करना चाहिए ; enum
पूर्णांक के अलावा कुछ नहीं करता है।
और अन्य प्रश्न
मैं सभी फाइलों को उपलब्ध कराने के लिए Reddit-Prefix.pch फ़ाइल में फ़ाइल आयात करने के बारे में सोच रहा था। क्या यह चीजों को करने का एक अच्छा तरीका है?
शायद हानिरहित, लेकिन शायद अत्यधिक। अपने स्थिरांक शीर्षकों को आयात करें जहाँ आपको उनकी आवश्यकता है।
उन समाधानों में से प्रत्येक के लिए उपयोग के मामले क्या हैं?
#define
: बहुत सीमित। मैं ईमानदारी से यकीन नहीं कर रहा हूँ कि अब स्थिरांक के लिए इसका उपयोग करने का एक अच्छा कारण है।
const
: स्थानीय स्थिरांक के लिए सर्वश्रेष्ठ। इसके अलावा, आपको इसे एक हेडर में घोषित एक के लिए उपयोग करना होगा और अब परिभाषित कर रहा है।
static const
: फ़ाइल-विशिष्ट (या वर्ग-विशिष्ट) स्थिरांक के लिए सर्वश्रेष्ठ।
extern const
: हेडर में स्थिरांक निर्यात करते समय आपको इसका उपयोग करना चाहिए।
इसके अलावा, यदि उपयोग करते हैं extern const
, तो क्या मुझे फ़ाइल आयात करने की आवश्यकता है, या फ़ाइल आयात किए बिना स्थिरांक वैश्विक रूप से उपलब्ध होंगे?
आपको फ़ाइल को आयात करने की आवश्यकता है, या तो प्रत्येक फ़ाइल में जहां आप उसका उपयोग करते हैं या उपसर्ग शीर्षक में।