2009-08-19 15 views
7

मुझे आश्चर्य है कि ऐप्पल क्यों उपयोग कर रहा है (कोरएनीमेशन में काफी भारी है, लेकिन कहीं और भी) स्थिरांक जिन्हें NSString * const के रूप में घोषित किया गया है उदाहरण के लिए kCAGravityTop नियमित enums के बजाय? इस मामले में सुरक्षा कैसे टाइप करें? जैसा कि मैं इसे समझता हूं, कोई भी किसी भी एनएसएसटींग को किसी भी कंपाइलर चेतावनियों के बिना इस स्थिरता की अपेक्षा करने वाली विधि को पास कर सकता है।एनम्स पर एनएसएसटींग स्थिरांक का उपयोग करने के कारण?

उत्तर

11

मुझे यकीन नहीं है, लेकिन मुझे लगता है कि उपयोगकर्ताओं को अपने स्वयं के एक्सटेंशन और सबक्लास को कुछ ऐप्पल सामानों में जोड़ने के साथ करना है। उस स्थिति में, आप केवल प्रयुक्त विधि को ओवरराइड कर सकते हैं और उस स्थिति को पकड़ सकते हैं जहां स्ट्रिंग "MyOwnValue" है और उसके बाद जो कुछ भी आप चाहते हैं उसे करें। ऐप्पल के enum को संशोधित करने से यह काफी आसान है, और यह आपको कुछ भी खराब करने से रोकता है।

यह ऐप्पल के संस्करण की आजादी के लिए आसान बनाने के लिए भी हो सकता है। Enums के साथ, यदि आप किसी भी तरह से अपने आदेश को पुनर्व्यवस्थित करते हैं तो यह उनके किसी भी मूल्य के लिए बहुत सी समस्याएं पैदा कर सकता है (किसी भी कारण से)। यदि enum का मान 1 < < 3 है जब इसे किसी फ़ाइल में सहेजा जाता है, तो ऐप्पल एक और enum जोड़ता है ताकि उसका मान अब 1 < < 4 हो, तो स्पष्ट रूप से गलत प्रोग्राम आपके प्रोग्राम से बाहर आ रहा है। वे सिर्फ एनम मूल्यों को चारों ओर जाने के बारे में सावधान क्यों नहीं होंगे, मुझे नहीं पता, लेकिन मुझे लगता है कि यह निश्चित रूप से संभव है कि उन्होंने एनएसएसटींग का उपयोग किया क्योंकि किसी भी संस्करण में इसका मूल्य या ऑर्डरिंग नहीं बदला जा सकता है।

+0

के लिए की आवश्यकता होगी है +1 अच्छी परिकल्पना – h4xxr

+0

इसके अतिरिक्त मुझे लगता है कि संग्रह और अनारक्षित एक कारक है।अब कोर डेटा जैसे ढांचे के साथ अधिक व्यापक रूप से उपयोग किया जा रहा है, आपको लगता है कि अगर enums का उपयोग किया जाता है तो वहां बहुत सारे मुक्केबाजी और अनबॉक्सिंग होते हैं जिन्हें स्ट्रिंग्स का उपयोग करने के लिए केवल तभी बाहर किया जा सकता है, हालांकि कुछ विचार अभी भी स्ट्रिंग स्थिरांक के लिए बने रहते हैं - अनावश्यक बोझ "नलसाजी" कम हो गया है। – TheBasicMind

7

मुझे संदेह है कि कारण किसी भी चीज़ से ऐतिहासिक या स्टाइलिस्ट अधिक है। इस तरह नेक्स्ट ढांचे ने इसे किया और यह कोको "शैली" बनाया। इस दृष्टिकोण के लाभ के रूप में, डीबगर में मान का निरीक्षण करने से सार्थक मूल्य (उदा। @ "CAGravityTop" या अर्थहीन int की बजाय कुछ ऐसा हो सकता है)। चूंकि स्थिर तारों को संकलक द्वारा बुद्धिमानी से संभाला जाता है, तुलना स्ट्रिंग समानता के बजाय सूचक तुलना द्वारा की जा सकती है (बीबीएम के उत्तर देखें), इसलिए इस दृष्टिकोण के लिए नगण्य प्रदर्शन हिट है।

9

समेकित प्रकारों को अतिरिक्त प्रकार के भीतर अतिरिक्त प्रविष्टियों को जोड़ने के बिना बढ़ाया नहीं जा सकता है। इस प्रकार, गणितीय सामग्री होना असंभव है जो दोनों को गणनात्मक प्रकार के औपचारिक सदस्य के रूप में माना जाता है, फिर भी सामान्य संकलन के दौरान दिखाई नहीं दे रहा है।

उदाहरण के लिए कोरएनीमेशन ले लो। ऐसे मान हो सकते हैं जो आंतरिक रूप से उपयोग किए जाते हैं जो विभिन्न कारणों से सार्वजनिक एपीआई के माध्यम से समर्थित या उपलब्ध नहीं हैं; "कार्यान्वयन विस्तार" तुरंत दिमाग में आता है।

इसके अलावा, स्थिरांक के रूप में स्ट्रिंग एक्सटेंशन को सक्षम बनाता है क्योंकि एली का तात्पर्य है। डीबगिंग करते समय वे अधिक जानकारीपूर्ण होते हैं। "kCAGravityTop" कहता है, "4" से कहीं अधिक संकेतक है।

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

5

एक और कारण मैं NSString के पक्ष में के बारे में सोचा है कि यह चारों ओर से पारित कर दिया जा सकता है जहाँ भी id (जैसे userInfo या के रूप में चाबियाँ शब्दकोश) स्वीकार किया जाता है, जबकि आदिम प्रकार (enums) आवरण किसी तरह इस

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