2015-06-16 9 views
42

लोन अंडरस्कोर फ़ंक्शन परिभाषाओं में क्या मतलब है?_ क्या है: स्विफ्ट में मुझे बता रहा है?

उदा map(_:)

मैं समझता हूँ कि मैं क्या कर सकते हैं जब कार्यों को परिभाषित:

func myFunc(_ string: String) { ... } 

मैं तो myFunc(_:) बजाय myFunc(_string:) है, यानी उद्देश्यपूर्ण पैरामीटर नाम छुपा के रूप में है कि का उल्लेख होगा?

+1

वर्थ पढ़ना: स्विफ्ट 3 कैसे समारोह/विधि पैरामीटर नाम और तर्क लेबल उपयोग किया जाता है के लिए कुछ परिवर्तन कर दिया है और नाम दिया है। यहां बहुत स्पष्टता वाले कार्यों में _underscores है: http://stackoverflow.com/questions/24437388/whats-the-underscore-representative-of-in-swift-references – Niraj

उत्तर

27

स्विफ्ट कह क्या एक समारोह का नाम है, सहित के लिए एक सम्मेलन की जरूरत है न केवल समारोह का नाम ही (कोष्ठकों से पहले), लेकिन यह भी मानकों के बाहरी नाम। सम्मेलन यह है कि नामों के बाद कोलों का पालन किया जाता है। तो यहाँ एक समारोह घोषणा (स्विफ्ट 2.0 में) है:

func myFunc(param1 param1:String, param2:String, param3:String) {} 

और यहाँ कि समारोह का नाम है:

myFunc(param1:param2:param3:) 

वास्तविक जीवन में, हालांकि, यह संभव (संभावना वास्तव में) है कि एक या अधिक पैरामीटर किसी भी नाम को बाहरी नहीं करेगा। इस प्रकार हमें उस नाम के लिए प्लेसहोल्डर की आवश्यकता है। अंडरस्कोर वह प्लेसहोल्डर है - जैसे अंडरस्कोर नाम के बाहरीकरण को दबाने की घोषणा में प्रतीक है। तो, यहाँ एक और समारोह घोषणा (स्विफ्ट 2.0 में) है:

func myFunc2(param1:String, _ param2:String, _ param3:String) {} 

और यहाँ कि समारोह का नाम है:

myFunc2(_:_:_:) 

[स्विफ्ट 2.0 कल्पना यहां महत्वपूर्ण है। स्विफ्ट 2.0 में, पहला पैरा नाम हमेशा डिफ़ॉल्ट रूप से बाहरी नहीं होता है, और अन्य पैरा नाम डिफ़ॉल्ट रूप से बाह्य होते हैं। स्विफ्ट 1.2 और इससे पहले, बाहरीकरण नियम इस बात पर निर्भर थे कि घोषणा कहां दिखाई दे रही थी, जो अनावश्यक रूप से असंगत और भ्रमित था।]

+0

पहली घोषणा में, आपने दूसरे और तीसरे पैरामीटर के लिए बाहरी नाम नहीं दिए हैं, न ही आपने # का उपयोग किया है। तो क्या इसे वास्तव में आपके पास संदर्भित किया जाना चाहिए, या यह सही है क्योंकि यह डिफ़ॉल्ट रूप से बाह्य है? - यदि हां, तो अब # की आवश्यकता नहीं है? – Alex

+1

@Alex क्या आपने मेरे उत्तर के नीचे नोट पढ़ा था? मैं स्विफ्ट 2.0 की स्थिति का वर्णन कर रहा हूं। और स्विफ्ट 2.0 में '#' चला गया है। – matt

+0

मैंने इसे पढ़ा, लेकिन मुझे 1.2 के साथ 2.0 को जोड़ने की कोशिश कर रहा था, जब मुझे नहीं होना चाहिए। आपने जो कहा है, वह समझ में आता है, मुझे इस बार 2.0 के साथ गाइड को फिर से पढ़ना होगा। @matt – Alex

61

_ परिभाषित करने के लिए कि पैरामीटर

यदि आपके पास नाम नहीं है प्रयोग किया जाता है कई _ यह कहा गया है कि आप अपने समारोह कॉल में पैरामीटर नाम की जरूरत नहीं है

func myFunc(name:String, _ age:String){ 
} 

myFunc(“Milo", "I'm a really old wizard") 

यदि आप करते हैं अंडरस्कोर का उपयोग न करें जो आप

myFunc(“Milo”, age: "I'm a really old wizard") 

_ फ़ंक्शन कॉल में आवश्यक नहीं है। यह सिर्फ यह इंगित करने के लिए प्रयोग किया जाता है कि कुछ का नाम नहीं है।

इस बात के संबंध में कि आप अपने कार्य को कैसे देखेंगे, आपको फ़ंक्शन कॉल के लिए कोई नाम नहीं देना होगा।
लेकिन जब से तुम भी एक पैरामीटर प्रकार यह एक अवैध उदाहरण की तरह मुझे लगता है परिभाषित नहीं करते

संपादित करें (यह कम से कम Xcode 7 में तेजी से 2.0 के साथ काम नहीं करता है):
के बाद से तेजी से 3.0

myFunc(name: “Milo”, age: "I'm a really old wizard") 

उपयोग किया जाना चाहिए

+0

मैं स्विफ्ट 2.0 के लिए नया हूं। मैं देखता हूं कि आपने दोनों मामलों में पहले पैरामीटर के लिए अंडरस्कोर का उपयोग नहीं किया था। तो क्या आपको फ़ंक्शन कॉल में नाम भी घोषित करना चाहिए: myFunc (name: "Milo", आयु: "मैं वास्तव में पुराना जादूगर हूं")? – user234159

10

किसी फ़ंक्शन का जिक्र करते समय, इसे असंबद्ध करने के लिए फ़ंक्शन का नाम किसी भी पैरामीटर के बाहरी नामों के साथ प्रदान करना आवश्यक है।

उदाहरण के लिए,

func myFunc(myString string: String) { ... }

और

func myFunc(_ string: String) { ... }

दो अलग-अलग काम करता है, वह है जहां एक बाहरी लेबल पहली स्ट्रिंग पैरामीटर के लिए प्रदान की जाती है प्रतिनिधित्व करते हैं जब समारोह कहा जाता है और अन्य जहां कोई लेबल उपयोग नहीं किया जाता है, जैसे:

myFunc(myString: "hi")

और

myFunc("hi")

तो, आदेश में एक समारोह हम प्रत्येक पैरामीटर जहां के लिए बाहरी लेबल शामिल की पहचान करने में ':' इंगित करता है कि एक पैरामीटर प्रदान किया जाना है - जैसे yourFunc(arg1:arg2:) 2 तर्क लेंगे।

जब कोई बाहरी लेबल उपयोग नहीं किया जाता है, तो हम अंडरस्कोर ('_') डालते हैं।

ऊपर दिए गए 2 कार्यों के लिए, हम विशिष्ट का उपयोग कर उन्हें पहचान होगा:

myFunc(myString:) और myFunc(_:)

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

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