2015-01-11 8 views
5

मैं एक खेल के मैदान में परीक्षण (शिक्षा) प्रयोजनों के लिए इस कोड लिखा है:डिफ़ॉल्ट पैरामीटर के साथ और बिना घोषित कॉलिंग फ़ंक्शन अलग-अलग परिणाम देता है?

import Cocoa 
func DoIt(a: Int, b: Int, c :Int = 0) -> Int { 
    return a + b + c; 
} 
func DoIt(a: Int, b: Int, c :NSObject) -> Int { 
    return a * b * c.description.lengthOfBytesUsingEncoding(NSUTF8StringEncoding); 
} 

और मैं यह मिल गया है जब मैं इसका इस्तेमाल किया:

DoIt(4, 5, 6);   // result: 20 
var obj = NSObject();  // result: NSObject 
DoIt(4, 5, obj);   // result: 520 

मैं पहली बार समारोह DoIt(Int, Int, Int) कहा जाता है की उम्मीद जब DoIt(4, 5, 6); कर लेकिन जाहिर है दूसरे को बुलाया जा रहा है। 6 कहां गया? ऐसा लगता है कि 6 को NSObject में स्पष्ट रूप से परिवर्तित किया गया था, उद्देश्य-सी में जो कम से कम एक चेतावनी उत्पन्न करेगा।
यह क्यों है?

उत्सुकता से अगर मैं अंतिम c: Int आवश्यक (= 0 को हटाकर) तो यह अपेक्षा के अनुसार काम करता है।

DoIt(4, 5, 6);   // result: 15 
var obj = NSObject();  // result: NSObject 
DoIt(4, 5, obj);   // result: 520 

Edit1: जोड़ा गया आईआर
मामले में यह समझने के लिए मैं निम्न आदेश जारी किए गए और परिणाम सार कड़ी में है क्या चल रहा है में मदद करता है: https://gist.github.com/nacho4d/94fdb72d8a3fee0c09e5

$ swiftc \ 
    -emit-ir /Users/nacho4d/Desktop/function2/function2/main.swift \ 
    -sdk Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.10.sdk 
+0

नहीं है रेडडिट पर एक धागा, शायद यह मदद करता है: [क्यों स्विफ्ट कंपाइलर एनएसएनंबर के लिए इंटीग्रेटर्स और अन्य प्राइमेटिव्स को परिवर्तित करता है] (http://www.reddit.com/r/swift/comments/2em7ic/why_swift_compiler_convert_implicitly_integers/) –

+0

मुझे नहीं पता यह इस काम क्यों करता है अरे, लेकिन मुझे विश्वास नहीं है कि यह इरादा व्यवहार है। अगर यह है तो यह मेरे लिए बहुत अजीब लगेगा। – Dair

+0

धन्यवाद @ सेबेस्टियन ड्रेस्लर मैं बस उस धागे को पढ़ता हूं। मैं निहित मुक्केबाजी (NSNumber के लिए आदिम) और इसके विपरीत अनबॉक्सिंग को समझता हूं। लेकिन मुझे यकीन नहीं है कि यह मामला यहां है। यह अभी भी अस्पष्ट है – nacho4d

उत्तर

4

"Functions" से स्विफ्ट दस्तावेज में (जोर जोड़ा):

डिफ़ॉल्ट मान

ज्यादातर मामलों में साथ पैरामीटर के लिए

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

इस प्रक्रिया को आसान बनाने के लिए, स्विफ्ट एक डिफ़ॉल्ट मान है कि किसी भी पैरामीटर के लिए एक स्वचालित बाहरी नाम प्रदान करता है। के रूप में अगर आप अपने कोड में स्थानीय नाम से पहले एक हैश प्रतीक लिखा था स्वत: बाहरी नाम, स्थानीय नाम के समान है।

तो आपका पहला समारोह घोषणा

func DoIt(a: Int, b: Int, c : Int = 0) -> Int 

एक बाहरी पैरामीटर नाम तीसरे पैरामीटर के लिए "सी" के साथ के रूप में

func DoIt(a: Int, b: Int, c c : Int = 0) -> Int 

संकलक द्वारा किया जाता है।इस समारोह , केवल

DoIt(4, 5, c: 6) // result: 15 

लेकिन कॉल के रूप में कहा जा

DoIt(4, 5, 6) 

अपना पहला समारोह की घोषणा से मेल नहीं खाता अन्य समारोह के लिए होता है कि

func DoIt(a: Int, b: Int, c :NSObject) -> Int 

(और तीसरा तर्क स्वचालित रूप से NSNumber पर ब्रिज किया गया है, जो उप-वर्गहैNSObject)। यही कारण है कि आपको "अप्रत्याशित" आउटपुट मिलता है।

आप

करने के लिए पहले समारोह की घोषणा को बदलते हैं
func DoIt(a: Int, b: Int, _ c : Int = 0) -> Int 

(के लिए "कोई बाहरी पैरामीटर नाम" _ खड़ा जहां) तो आप उम्मीद उत्पादन प्राप्त होगा:

DoIt(4, 5, 6) // result: 15 
+0

यह बहुत सी चीजें बताता है! अब मैं स्पष्ट रूप से देखता हूं कि वैकल्पिक पैरामीटर वाले कार्यों के लिए मुझे बाहरी पैरामीटर नाम का उपयोग करने या घोषणा में '_' का उपयोग करने की आवश्यकता है :)। हालांकि मुझे अभी भी समझ में नहीं आता कि 'इंट' को 'एनएसओब्जेक्ट' में कैसे परिवर्तित किया गया है? – nacho4d

+1

@ nacho4d: स्विफ्ट स्वचालित रूप से कुछ देशी प्रकारों (इंट, फ्लोट, बूल, ...) को एनएसएनंबर में पुल करता है, जो एनएसओब्जेक्ट का उप-वर्ग है। आप इसके बारे में और अधिक पढ़ सकते हैं [कोको और उद्देश्य-सी के साथ स्विफ्ट का उपयोग करना) (https://developer.apple.com/library/prerelease/ios/documentation/Swift/Conceptual/BuildingCocoaApps/), सेक्शन "कोको डेटा के साथ काम करना प्रकार "। - मैंने इसे और स्पष्ट करने के लिए उत्तर अपडेट किया है। –

+0

मैं देखता हूँ! बहुत धन्यवाद! – nacho4d

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

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