2015-03-25 23 views
13

करने के लिए बदल में ObjC स्ट्रिंग, सरणी और शब्दकोश सभी संदर्भ प्रकार, जबकि स्विफ्ट में वे सब मूल्य प्रकार के होते हैं कर रहे हैं।क्यों स्ट्रिंग, सरणी और स्विफ्ट में शब्दकोश मान प्रकार

  1. मैं पर्दे के पीछे क्या कारण है, मेरी समझ के लिए यह पता लगाने के लिए चाहते हैं, कोई फर्क नहीं पड़ता कि यह एक संदर्भ प्रकार या मान प्रकार वस्तुओं दोनों ObjC और स्विफ्ट में ढेर में रहते है।

  2. आसान कोडिंग बनाने के लिए परिवर्तन था? यानी यदि यह संदर्भ प्रकार है तो ऑब्जेक्ट का पॉइंटर शून्य नहीं हो सकता है, इसलिए ऑब्जेक्ट तक पहुंचने के लिए पॉइंटर और ऑब्जेक्ट दोनों को जांचने की आवश्यकता नहीं है। हालांकि यदि यह मूल्य प्रकार है तो केवल ऑब्जेक्ट को जांचने की आवश्यकता है?

  3. लेकिन स्मृति आवंटन के मामले में, मूल्य प्रकार और संदर्भ प्रकार एक ही है, ठीक कह रहे हैं? दोनों स्मृति के समान आकार आवंटित?

धन्यवाद

उत्तर

15

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

करके सरणियों, शब्दकोशों आदि मूल्य प्रकार, यह आश्चर्य की बात व्यवहार से बचा जाता है। जब आप एक स्विफ्ट सरणी प्राप्त करते हैं, तो आप जानते हैं कि कोई भी आपकी पीठ के पीछे इसे संशोधित करने वाला नहीं है। ऑब्जेक्ट जिन्हें आपकी पीठ के पीछे संशोधित किया जा सकता है, समस्याओं के लिए एक प्रमुख स्रोत हैं।

असल में, स्विफ्ट कंपाइलर जब भी संभव हो अनावश्यक प्रतिलिपि से बचने की कोशिश करता है। तो अगर यह कहता है कि एक सरणी आधिकारिक रूप से कॉपी की गई है, तो इसका मतलब यह नहीं है कि यह वास्तव में कॉपी किया गया है।

+2

मैंने समस्याओं के उस प्रमुख स्रोत में कभी फंस नहीं लिया है। हालांकि, सरणी की प्रति कितनी गहरी है? और यह "समस्याओं का प्रमुख स्रोत" क्यों है, जब सरणी बदलती है, लेकिन "समस्याओं का प्रमुख स्रोत" नहीं होता है, जब उस सरणी में किसी आइटम ने अपनी किसी एक गुण को बदल दिया है? और स्विफ्ट टीम में वे क्यों सोचते थे कि किसी आइटम का परिवर्तन "समस्याओं का प्रमुख स्रोत" नहीं है, जबकि सरणी की लंबाई बदलना लंबे समय तक "समस्याओं का प्रमुख स्रोत" है और उन्होंने अपनी राय क्यों बदल दी? –

+0

मैं आपसे अधिकतर सहमत हूं, लेकिन मुझे लगता है कि, ओब्जे-सी में यह डेवलपर्स की ज़िम्मेदारी है कि जब तक कोई अन्य विकल्प न हो, तब तक उत्परिवर्तनीय वस्तुओं को पास/अनुरोध न करें। गैर-परिवर्तनीय वस्तुओं को कॉलर की पीठ के पीछे संशोधित नहीं किया जा सकता है, इसलिए इस परिप्रेक्ष्य से आपका तर्क मुझे एक तरह से टूटा हुआ दिखता है। – holex

+0

तर्क का मेरा बिंदु यह है कि "मेरी पीठ के पीछे संशोधन" अभ्यास में गंभीर समस्याएं नहीं पैदा करता है। यह स्विफ्ट के "हम एक समस्या को हल करते हैं जो केवल सैद्धांतिक रूप से मौजूद है" सुविधाओं में से एक है। क्या आपको केवल एक बार उत्पादन कोड में समस्या है? तो शुरुआत में कोई समस्या नहीं होने के लिए एक त्वरित और गंदे (असंगत) समाधान था और अब हमारे पास कोई समस्या नहीं है जो किसी भी समस्या के लिए लगातार समाधान करता है जो कभी-कभी और अधिक कठिन सोचता है और एक प्रदर्शन प्रिंट होगा। –

-4

मैं नहीं पता है, कि क्या यह इसके पीछे असली विचार है, लेकिन एक ऐतिहासिक इस पर दृश्य है: शुरुआत में

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

सरणियों पर बाद में प्रति व्यवहार से एक पूरा हो गया है, क्या कम भ्रामक है। (आपको याद है, स्विफ्ट पठनीयता के लिए था। स्पष्ट रूप से स्विफ्ट की अवधारणा में, पठनीयता का अर्थ है "पढ़ने के लिए कम वर्ण", लेकिन इसका मतलब यह नहीं है कि "बेहतर समझने योग्य"। विशिष्ट स्विफ्ट शब्द: एक buzzword का उपयोग करें, इसे जिस तरह से उपयोग करें, यह स्विफ्ट के लिए उपयुक्त है, शुद्धता के बारे में परवाह नहीं है। मैं पहले से ही है कि उल्लेख किया था?)

तो, मुझे लगता है कि यह अभी भी प्रदर्शन के साथ साथ समझा जा सकता व्यवहार शायद कम प्रदर्शन करने के लिए अग्रणी है। (आपको बेहतर पता चलेगा कि आपके कोड में एक प्रति की आवश्यकता है और आप अभी भी ऐसा कर सकते हैं और यदि आप स्रोत सरणी अपरिवर्तनीय हैं, तो आप कोको से 0-ऑपरेशन प्राप्त कर सकते हैं।) बेशक, वे कह सकते हैं: "ठीक है, मूल्य से था एक गलती, हमने इसे बदल दिया। " लेकिन वे कभी नहीं कहेंगे।

हालांकि, अब स्विफ्ट में सरणी लगातार व्यवहार करती है। स्विफ्ट में एक बड़ी प्रगति! शायद आप इसे एक प्रोग्रामिंग भाषा एक धूप दिन कह सकते हैं।

+4

यह किसी भी प्रश्न का उत्तर नहीं देता है। सामान्य रूप से स्विफ्ट पर यह आपकी राय है। – HAS

+0

@HAS यह गलत है। –

6

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

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

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

2

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

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