स्विफ्ट फ़ंक्शन में डिफ़ॉल्ट वैकल्पिक पैरामीटर


107

जब मैं firstThingडिफ़ॉल्ट करने के लिए सेट करता हूं तो nilयह काम करेगा, बिना डिफ़ॉल्ट मान के nilमुझे एक त्रुटि मिलती है कि फ़ंक्शन को कॉल करते समय एक लापता पैरामीटर है।

टाइप करके Int?मैंने सोचा कि यह डिफ़ॉल्ट रूप से वैकल्पिक है nil, क्या मैं सही हूं? और यदि हां, तो यह बिना काम क्यों नहीं करता है = nil?

func test(firstThing: Int? = nil) {
    if firstThing != nil {
        print(firstThing!)
    }
    print("done")
}
test()

1
विचार करें कि आप लिख सकते हैं func test(firstThing: Int = 4): Optionalएक डिफ़ॉल्ट मान के साथ एक गैर- पैरामीटर। Optionalप्रकार (जो क्या है ?करने के लिए एक प्रकार का नाम फैलता में) एक मूल्य के प्रकार है; "वैकल्पिक पैरामीटर" एक पैरामीटर के लिए एक दुर्भाग्यपूर्ण नाम है जो फ़ंक्शन कॉल में मौजूद हो सकता है या नहीं, भले ही इसके प्रकार की परवाह किए बिना।
zneak

इस कोड का परीक्षण करने के लिए आपने स्विफ्ट के किस संस्करण का उपयोग किया है? आपका कोड ठीक काम करता है !! वैकल्पिक केवल एक प्रकार है, और डिफ़ॉल्ट पैरामीटर स्विफ्ट में एक अन्य प्रकार के साथ ठीक काम करता है
विक्टर सिगलर

जवाबों:


210

वैकल्पिक और डिफ़ॉल्ट पैरामीटर दो अलग-अलग चीजें हैं।

एक वैकल्पिक एक चर है जो हो सकता है nil, वह है।

डिफ़ॉल्ट पैरामीटर का उपयोग डिफ़ॉल्ट जब आप उस पैरामीटर, इस डिफ़ॉल्ट मान इस तरह निर्दिष्ट किया जाता है छोड़ मूल्य:func test(param: Int = 0)

यदि आप एक पैरामीटर निर्दिष्ट करते हैं जो एक वैकल्पिक है, तो आपको इसे प्रदान करना होगा, भले ही आप जिस मूल्य को पास करना चाहते हैं वह है nil। यदि आपका कार्य इस तरह दिखता है func test(param: Int?), तो आप इसे इस तरह नहीं कह सकते test()। पैरामीटर वैकल्पिक होने के बावजूद, इसमें डिफ़ॉल्ट मान नहीं है।

आप दो को भी जोड़ सकते हैं और एक पैरामीटर है जो एक वैकल्पिक लेता है जहां nilडिफ़ॉल्ट मान है, जैसे func test(param: Int? = nil):।


27
"यदि आप एक पैरामीटर निर्दिष्ट करते हैं जो एक वैकल्पिक है, तो आपको इसे प्रदान करना होगा"। महान, धन्यवाद स्विफ्ट
andrewtweber

8
@andrewtweber आपके हास्य की सराहना की जाती है, लेकिन न्यूबाय्स के लिए, मुझे लगा कि यह स्पष्ट करना सहायक हो सकता है कि "वैकल्पिक" एक वस्तु या मूल्य प्रदान करने के लिए संदर्भित करता है। आपको ऐसा करने की आवश्यकता नहीं है, आप इसके बजाय शून्य (जो किसी वस्तु या मूल्य की अनुपस्थिति का प्रतिनिधित्व करते हैं) प्रदान कर सकते हैं। आपको बस यह तय करना है कि आप कौन सा विकल्प चुन रहे हैं।
जेडी सैंडिफ़र

23

डिफ़ॉल्ट तर्क आपको फ़ंक्शन को बिना तर्क पास किए कॉल करने की अनुमति देता है। यदि आप तर्क पास नहीं करते हैं, तो डिफ़ॉल्ट तर्क की आपूर्ति की जाती है। तो अपने कोड का उपयोग कर, यह ...

test()

... बिल्कुल ऐसा ही है:

test(nil)

यदि आप डिफ़ॉल्ट तर्क को इस तरह छोड़ देते हैं ...

func test(firstThing: Int?) {
    if firstThing != nil {
        print(firstThing!)
    }
    print("done")
}

... तो अब आप ऐसा नहीं कर सकते ...

test()

यदि आप करते हैं, तो आपको "लापता तर्क" त्रुटि मिलेगी जो आपने वर्णित की थी। आपको हर बार एक तर्क पास करना होगा, भले ही वह तर्क सिर्फ nil:

test(nil)   // this works

18

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

पैरामीटर के लिए डिफ़ॉल्ट मान आपको फ़ंक्शन को कॉल करते समय निर्दिष्ट किए बिना मान निर्दिष्ट करने की अनुमति देता है। यही कारण है कि test()जब आप परीक्षण की घोषणा पर एक डिफ़ॉल्ट मान निर्दिष्ट करते हैं तो काम करता है।

यदि आप उस डिफ़ॉल्ट मान को शामिल नहीं करते हैं, तो आपको कॉल पर मूल्य प्रदान करने की आवश्यकता है test(nil):।

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

func test(firstThing: Int? = nil) {
    if let firstThing = firstThing {
        print(firstThing)
    }
    print("done")
}
test()

7

आप Optionalडिफ़ॉल्ट होने के साथ भ्रमित कर रहे हैं । एक Optionalमान या शून्य स्वीकार करता है। डिफ़ॉल्ट होने से फ़ंक्शन को कॉल करने में तर्क छोड़ने की अनुमति मिलती है। एक तर्क Optionalप्रकार के साथ या उसके बिना एक डिफ़ॉल्ट मान हो सकता है ।

func someFunc(param1: String?,
          param2: String = "default value",
          param3: String? = "also has default value") {
    print("param1 = \(param1)")

    print("param2 = \(param2)")

    print("param3 = \(param3)")
}

आउटपुट के साथ उदाहरण कॉल:

someFunc(param1: nil, param2: "specific value", param3: "also specific value")

param1 = nil
param2 = specific value
param3 = Optional("also specific value")

someFunc(param1: "has a value")

param1 = Optional("has a value")
param2 = default value
param3 = Optional("also has default value")

someFunc(param1: nil, param3: nil)

param1 = nil
param2 = default value
param3 = nil

संक्षेप में:

  • के साथ टाइप करें? (उदा। स्ट्रिंग?) एक Optionalशून्य हो सकता है या टाइप का एक उदाहरण हो सकता है
  • डिफ़ॉल्ट मान के साथ तर्क एक कॉल से कार्य करने के लिए छोड़ा जा सकता है और डिफ़ॉल्ट मान का उपयोग किया जाएगा
  • यदि दोनों Optionalऔर डिफ़ॉल्ट है, तो इसे फ़ंक्शन कॉल से छोड़ा जा सकता है या शामिल किया जा सकता है और इसे शून्य मान के साथ प्रदान किया जा सकता है (उदाहरण param1: nil)

क्या मैं लेट या वेरिएबल के रूप में डिफॉल्ट पैरामीटर को जोड़ सकता हूं? साभार
योगेश पटेल

@YogeshPatel यकीन नहीं है कि आप क्या मतलब है।
चक क्रट्सिंगर

जैसे var myName = "योगेश"। अब, मेरा फंक्शन 1. फंक गेटफिल्टरनेम (नाम: string = myName) {} जैसा है। यह तरीका मेरे लिए काम नहीं कर रहा है। 2. func getFilterNames (नाम: string = "योगेश") {} यह दृष्टिकोण मेरे लिए काम कर रहा है। लेकिन मुझे पहले एक चाहिए ताकि आप इसे प्राप्त करने में मेरी मदद कर सकें। आपका बहुत बहुत धन्यवाद!
योगेश पटेल

@YogeshPatel मुझे लगता है कि आप func getFilterNames(name: inout String){ }जो चाहते हैं वह हो सकता है जो आपको उस नाम को संशोधित करने की अनुमति देगा,
चक कृत्सिंगर

नहीं सर नहीं। मैं अपने पैरामीटर को संशोधित नहीं करना चाहता। मैं सिर्फ अपने पैरामीटर को डिफ़ॉल्ट मान देना चाहता हूं लेकिन स्थिर "योगेश" की तरह नहीं। मैं इस तरह का नाम = "योगेश" गतिशील फंक getFilterNames (नाम: string = name) करना चाहता हूं। यह हो रहा है सर? धन्यवाद!
योगेश पटेल

4

यदि आपको बूल परम का उपयोग करने की आवश्यकता है, तो आपको डिफ़ॉल्ट मान निर्दिष्ट करने की आवश्यकता है।

func test(WithFlag flag: Bool = false){.....}

तो आप परम के साथ या बिना उपयोग कर सकते हैं:

test() //here flag automatically has the default value: false
test(WithFlag: true) //here flag has the value: true

ऐसे लोगों के लिए जो इसे कम करते हैं, आप इसके बजाय गलत चीज़ को ठीक कर सकते हैं, इसलिए अन्य लोग समझेंगे।
नीब फौदा

3

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

शब्द "वैकल्पिक पैरामीटर" भ्रामक प्रतीत होता है। स्पष्ट करने के लिए, "वैकल्पिक पैरामीटर" के बजाय "वैकल्पिक प्रकार पैरामीटर" कहना अधिक सटीक है क्योंकि "वैकल्पिक" शब्द यहां केवल पैरामीटर मान के प्रकार का वर्णन करने के लिए है और कुछ नहीं।


0

यदि आप funcपैरामीटर के साथ या उसके बिना कॉल करने में सक्षम होना चाहते हैं तो आप funcउसी नाम का एक दूसरा बना सकते हैं जो दूसरे को कॉल करता है।

func test(firstThing: Int?) {
    if firstThing != nil {
        print(firstThing!)
    }
    print("done")
}

func test() {
    test(firstThing: nil)
}

अब आप testपैरामीटर के बिना या बिना नाम के एक फ़ंक्शन को कॉल कर सकते हैं ।

// both work
test()
test(firstThing: 5)

जब आप पैरामीटर के लिए डिफ़ॉल्ट मान के रूप में शून्य निर्दिष्ट कर सकते हैं तो आप एक अतिरिक्त फ़ंक्शन को क्यों परिभाषित करेंगे?
पीटर शॉर्न

-1

यह थोड़ा मुश्किल है जब आप उस पैरामीटर के लिए वैकल्पिक पैरामीटर और डिफ़ॉल्ट मान को संयोजित करने का प्रयास करते हैं। ऐशे ही,

func test(param: Int? = nil)

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

इसलिए यह हमेशा बेहतर होता है कि डिफ़ॉल्ट मान के रूप में नील का उपयोग न करें।


1
यह गलत है। एक डिफ़ॉल्ट मान (यहां तक ​​कि nil) वाले वैकल्पिक के साथ कुछ भी गलत नहीं है ।
ब्रायन केंडिग

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

1
यह सच नहीं है, और मुझे यकीन नहीं है कि आप क्या वर्णन करने की कोशिश कर रहे हैं। मुझे लगता है कि आप सही ढंग से कह रहे हैं कि एक बार एक चर के पास इसे सौंपा गया मूल्य है, यह हमेशा सौंपा जाएगा; जब तक आप इसे निपटा नहीं लेते, तब तक आप इसे अनसाइन नहीं कर सकते (न ही आप चाहते हैं)। और स्विफ्ट आपको एक संकलन त्रुटि देगा यदि आप एक वैरिएबल का उपयोग करने का प्रयास करते हैं इससे पहले कि इसका कोई मान हो (जैसा कि var foo: String; print(foo))। लेकिन एक डिफ़ॉल्ट मान के साथ एक फ़ंक्शन तर्क एक वैकल्पिक तर्क है (आपको इसे फ़ंक्शन कॉल में पास नहीं करना है) और यह वैकल्पिक प्रकार का भी हो सकता है ( nilइसे डिफ़ॉल्ट मूल्य के रूप में भी सौंपा जा सकता है)।
ब्रायन केंडिग

एक वैकल्पिक रूप से एक संघ प्रकार का है <प्रकार | Nil>, अर्थात इसमें निर्दिष्ट प्रकार या शून्य प्रकार हो सकता है। (स्विफ्ट की मानें तो यूनियंस के पास यह नहीं था, लेकिन हम यहां वैचारिक रूप से बात कर रहे हैं)। इतना इंट? = नील पूरी तरह से ठीक है।
शाइनी

-1

डिफ़ॉल्ट मान का मतलब डेटा प्रकार का डिफ़ॉल्ट मान नहीं होता है। डिफ़ॉल्ट फ़ंक्शन के दौरान डिफ़ॉल्ट मान का अर्थ परिभाषित फ़ंक्शन के समय होता है। हमें फंक्शन में वेरिएबल को डिफाइन करते समय वेरिएबल की डिफॉल्ट वैल्यू घोषित करनी होती है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.