2014-07-12 11 views
6

मैं 2014 डब्ल्यूडब्ल्यूडीसी ट्यूटोरियल 408 का अनुसरण कर रहा हूं: एक्सकोड बीटा 3 (30 मिनट में) का उपयोग कर स्विफ्ट प्लेग्राउंड्स। स्विफ्ट वाक्य रचना बीटा 2.स्विफ्ट ऐरे वैकल्पिक प्रकार और सबस्क्रिप्टिंग (बीटा 3)

var data = [27, 46, 96, 79, 56, 85, 45, 34, 2, 57, 29, 66, 99, 65, 66, 40, 40, 58, 87, 64] 

func exchange<T>(data: [T], i: Int, j: Int) { 
    let temp = data[i] 
    data[i] = data[j] // Fails with error '@lvalue $T8' is not identical to 'T' 
    data[j] = temp  // Fails with error '@lvalue $T5' is not identical to 'T' 
} 

exchange(data, 0 , 2) 
data 

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

उत्तर

10

क्योंकि सबराउटिन पैरामीटर को let के साथ स्पष्ट रूप से परिभाषित किया गया है, इसलिए गैर परिवर्तनीय। करने के लिए घोषणा बदलने का प्रयास करें:

func exchange<T>(inout data: [T], i: Int, j: Int) { 

और मंगलाचरण के लिए:

exchange(&date, 0, 2) 

तुम भी var उपयोग कर सकते हैं लेकिन यह है कि केवल सरणी सबरूटीन के भीतर संशोधित करने की अनुमति होगी। बीटा 3 के लिए बड़ा परिवर्तन कुछ समय के आधार पर केवल प्रकार के सॉर्टा पास के बजाय एरे वास्तव में मूल्य से गुजरना था, लेकिन शेष नहीं।

+0

यह हल हो गया है, धन्यवाद। –

2

@ डेविड उत्तर सही है, मुझे बताएं कि क्यों: सरणी (साथ ही शब्दकोश और स्ट्रिंग्स) मूल्य प्रकार (structs) हैं और संदर्भ प्रकार नहीं हैं। जब किसी फ़ंक्शन को किसी मान प्रकार को पास करना होता है, तो इसकी एक प्रति बनाई जाती है, और फ़ंक्शन उस प्रतिलिपि पर काम करता है।

inout संशोधक का उपयोग करके, मूल सरणी इसके बजाए पारित की जाती है, इसलिए उस स्थिति में इसमें बदलाव करना संभव है।

+0

मेरे पास एक प्रश्न है। उदाहरण के लिए, मेरे पास एक ऑब्जेक्ट है जिसमें एक सरणी शामिल है। और मैं इस वस्तु को UIViewController की संपत्ति के माध्यम से पास करता हूं। संदर्भ के रूप में इसे पास करने के लिए मुझे क्या करना चाहिए? –

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