2017-07-24 8 views
5

साथ काम नहीं करता क्यों +=, परोक्ष unwrapped optionals साथ काम नहीं करता, उदाहरण के लिए:क्यों `+ =` परोक्ष unwrapped optionals

var count: Int! = 10 
count = count + 10 // This works 
count += 10 // this does not work 

क्यों नहीं वैकल्पिक परोक्ष unwrapped, count = count + 10 के मामले की तरह है?

+1

ऑपरेटर को संदर्भ की आवश्यकता है। – Sulthan

+0

क्या आप इसे और समझा सकते हैं? –

+0

फ़ंक्शन "+ =" एक इंट व्यय करता है। आप इसे एक इंट दे रहे हैं! – scord

उत्तर

2

क्योंकि यौगिक असाइनमेंट ऑपरेटर += उम्मीद बाईं ओर एक परिवर्तनशील Int चर होने के लिए यह काम नहीं करता। जब आप इसे count पास करते हैं, तो कंपाइलर पूरी तरह से अनचाहे वैकल्पिक को अनचाहे करता है और इसके बजाय एक अपरिवर्तनीय Int मान भेजता है, जिसे inout पैरामीटर के रूप में पारित नहीं किया जा सकता है जो += अपेक्षा करता है।

तुम सच में ऐसा करना चाहते हैं, तो आप += ओवरलोड कर सकते हैं:

func += (left: inout Int!, right: Int) { 
    left = left! + right 
} 

अब += यह unwrapping के बिना एक परोक्ष unwrapped वैकल्पिक के रूप में बाईं ओर भेजता है, और unwrapping समारोह के अंदर स्पष्ट रूप से किया जाता है।

var count: Int! = 10 
count = count + 10 // 20 
count += 10 // 30 
+0

तो क्यों गिनती + 10 काम कर रही है? –

+0

यह उत्तर सही नहीं है। अभिव्यक्ति में 'गिनती + = 10',' गिनती 'को निश्चित रूप से एक ठोस ('Int') मान में छोड़ा जाएगा, लेकिन वह मान _ अपरिवर्तनीय होगा (एक स्पष्ट रूप से अनचाहे वैकल्पिक _ के लिपटे मूल्य प्रतिनिधित्व की एक संपत्ति जो इसे प्रदान की जाती है implicitly_)। चूंकि '+ =' विधि (/ ऑपरेटर) का पहला तर्क (या बाएं हाथ की ओर) एक 'इनआउट' पैरामीटर है, स्वाभाविक रूप से आप इसे अपरिवर्तनीय गुण नहीं दे सकते हैं। – dfri

+0

(... उपरोक्त कस्टम '+ =' ऑपरेटर केवल इस मामले के लिए एक और अधिक विशिष्ट अधिभार प्रदान करता है जब 'lhs' प्रकार (' inout') 'Int! 'और' rhs' प्रकार' Int' है। का मतलब है कि कॉल 'गिनती + = 10' (अधिभार से मिलान करने के लिए' (+ =) (इनआउट इंट, इंट) से मिलान करने के लिए 'गिनती' को अनिश्चित रूप से अनदेखा करने की आवश्यकता नहीं होगी, क्योंकि उस कॉल के लिए एक आदर्श ओवरलोड मैच है अधिभार के शरीर, हालांकि, स्पष्ट रूप से लपेटे हुए मूल्य को अनचाहे करते हैं, जिससे इसके उत्परिवर्तन की अनुमति मिलती है)। – dfri

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