2014-06-12 5 views
5

में struct के परिवर्तनशील संस्करण लौटें मैं एक तरीकों कि struct ही return selfस्विफ्ट

का उपयोग कर दुर्भाग्य से मैं के प्रकार के "struct नाम" अपरिवर्तनीय मूल्य मिल रहा है का परिणाम होती हैं केवल अस्थायी सदस्य का नाम 'विधि नाम' त्रुटि है।

मैं कैसे ऐसी है कि struct परिवर्तनशील है लौट सकते हैं?

+1

के रूप में struct उपयोग करने के लिए तेजी से बताने के लिए दिखाने के अपने कोड और पूर्ण त्रुटि संदेश है (यह भी संकेत मिलता है जो लाइन) –

+0

संपादन सवाल और जोड़ने कोड –

उत्तर

8

तुम बस ठीक structs उत्परिवर्तित कर सकते हैं, लेकिन आप mutating साथ उन लोगों के परिवर्तनशील तरीकों पर टिप्पणी करने के लिए है।

struct SomeStruct { 
    var x:Int = 0 
    mutating func increment() { 
     x++; 
    } 
} 

संपादित करें:

मुझे कुछ स्पष्टीकरण यहां करते हैं। Structs उत्परिवर्तित जा सकता है:

var structA = SomeStruct() 
structA.x // 0 
structA.increment() 
structA.x // 1 

लेकिन केवल तभी जब आप var के रूप में यह घोषणा की। यह संकलन नहीं:

let structA = SomeStruct() 
// structA.increment() // Compile error 

अब जब आप something.methodReturningStruct().mutatingMethod() की तरह कुछ करते हैं, methodReturningStruct() वास्तव में मूल struct की एक प्रति वापस आ जाएगी (मूल्य प्रकार के आधार पर)। लेकिन जब से तुम यह एक var को आवंटित नहीं किया है, यह परोक्ष एक निरंतर रूप में माना जाएगा (अर्थात let) ताकि आप उस संकलक त्रुटि मिलती है।

आप अभी भी एक ही बात कर सकते हैं, लेकिन तुम सिर्फ एक var

var structB = something.methodReturningStruct() 
structB.mutatingMethod() 
+1

आप उन्हें किसी अन्य विधि की वापसी से सीधे म्यूट नहीं कर सकते हैं। 'structA.methodReturningSelf()। mutatingMethod()' – drewag

+1

ऐसा इसलिए है क्योंकि आपने इसे जंजीर किया है। संकलक देखता है कि 'methodReturningSelf() 'मूल' structA' की प्रतिलिपि देता है, लेकिन आपने इसे बिना किसी कार्य के सीधे एक विधि कहा (नई प्रति बेकार बनाते हुए, साथ ही साथ 'mutatingMethod()' बेकार । यह ठीक काम करेगा: 'वर structB = structA.methodReturningSelf(); structB.mutatingMethod()' नोट बजाय 'let' की' var' उपयोग –

+0

प्रश्न के पूरे मुद्दे सक्षम होने के लिए है उन्हें – drewag