2014-10-27 7 views
8

स्विफ्ट में, जब आप मान प्रकार पास करते हैं, तो फ़ंक्शन में एक ऐरे कहें। फ़ंक्शन का उपयोग करने के लिए सरणी की एक प्रति बनाई गई है।प्रतिलिपि मूल्य प्रकारों के लिए प्रतिलिपि कब होती है

हालांकि https://developer.apple.com/library/ios/documentation/Swift/Conceptual/Swift_Programming_Language/ClassesAndStructures.html#//apple_ref/doc/uid/TP40014097-CH13-XID_134 पर दस्तावेज़ भी कहते हैं:

वर्णन ऊपर तार, सरणियों, और शब्दकोशों की "नकल" को दर्शाता है। आपके कोड में जो व्यवहार आप देखते हैं वह हमेशा ऐसा होगा जैसे प्रतिलिपि हुई थी। हालांकि, स्विफ्ट केवल दृश्यों के पीछे एक वास्तविक प्रतिलिपि करता है जब ऐसा करने के लिए बिल्कुल जरूरी होता है। स्विफ्ट इष्टतम प्रदर्शन सुनिश्चित करने के लिए सभी मूल्य प्रतिलिपि का प्रबंधन करता है, और आपको इस अनुकूलन को पूर्ववत करने का प्रयास करने के लिए असाइनमेंट से बचना नहीं चाहिए।

तो क्या इसका मतलब यह है कि प्रतिलिपि वास्तव में केवल तब होती है जब पास मूल्य प्रकार संशोधित होता है?

क्या यह दिखाने का कोई तरीका है कि यह वास्तव में अंतर्निहित व्यवहार है?

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

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

+4

जैसा कि मैं इसे समझता हूं, स्विफ्ट एरे का व्यवहार जिसे "लिखने पर प्रतिलिपि" कहा जाता है, यानी, स्विफ्ट समझदारी से कार्य करेगा, जैसा कि आप उम्मीद कर रहे हैं, एक अपरिवर्तनीय सरणी के लिए: क्योंकि आप इसे नहीं लिख सकते हैं, इसे कभी कॉपी नहीं किया जाना चाहिए। –

उत्तर

0

मुझे नहीं पता कि यह स्विफ्ट में प्रत्येक मूल्य प्रकार के लिए समान है, लेकिन Array के लिए मुझे यकीन है कि यह एक कॉपी-ऑन-राइट है, इसलिए जब तक आप इसे संशोधित नहीं करते हैं, तब तक इसकी प्रतिलिपि नहीं होती है, और जैसा कि आपने कहा था कि यदि आप इसे स्थिर के रूप में पास करते हैं तो आप वैसे भी जोखिम नहीं चलाते हैं।

पेज। स्विफ्ट 1.2 में ऐसे नए एपीआई हैं जिनका उपयोग आप अपने मूल्य-प्रकारों पर कॉपी-ऑन-राइट को लागू करने के लिए भी कर सकते हैं

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