সুইফট ফাংশনে ডিফল্ট alচ্ছিক পরামিতি


107

আমি যখন firstThingডিফল্ট সেট করি তখন nilএটি কাজ করবে, ডিফল্ট মান ব্যতীত nilআমি একটি ত্রুটি পেয়েছি যে ফাংশনটি কল করার সময় একটি অনুপস্থিত পরামিতি রয়েছে।

টাইপ করে Int?আমি ভেবেছিলাম এটি একটি ডিফল্ট মান দিয়ে এটি alচ্ছিক করেছে nil, আমি ঠিক আছি? এবং যদি তাই হয় তবে কেন এটি কাজ করে না = nil?

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

1
আপনি লিখতে পারেন তা বিবেচনা করুন func test(firstThing: Int = 4): Optionalডিফল্ট মান সহ একটি অ- পরামিতি। Optionalটাইপ (যা কি ?করার জন্য একটি টাইপ নাম বিস্তৃতি) একটি মান প্রকার; "alচ্ছিক প্যারামিটার" একটি প্যারামিটারের দুর্ভাগ্যজনক নাম যা কোনও ফাংশন কলে উপস্থিত থাকুক বা নাও থাকুক, তার ধরন নির্বিশেষে।
জেনাক

এই কোডটি পরীক্ষা করতে আপনি সুইফ্টের কোন সংস্করণ ব্যবহার করেছেন? আপনার কোড ভাল কাজ করে !! Ptionচ্ছিক কেবল একটি টাইপ, এবং ডিফল্ট প্যারামিটারগুলি
সুইফটে

উত্তর:


210

বিকল্প এবং ডিফল্ট পরামিতি দুটি পৃথক জিনিস।

একটি ptionচ্ছিক একটি পরিবর্তনশীল যা হতে পারে nil, এটিই।

ডিফল্ট প্যারামিটারগুলি একটি ডিফল্ট মান ব্যবহার করে আপনি যখন সেই প্যারামিটারটি বাদ দেন, এই ডিফল্ট মানটি এটির মতো নির্দিষ্ট করা হয়:func test(param: Int = 0)

আপনি যদি একটি প্যারামিটার নির্দিষ্ট করে থাকেন যা alচ্ছিক, আপনি এটি সরবরাহ করতে হবে, আপনি যে মানটি পাস করতে চান তা হ'ল nil। আপনার ফাংশনটি যদি দেখতে দেখতে লাগে তবে func test(param: Int?)আপনি এটির মতো কল করতে পারবেন না test()। প্যারামিটারটি isচ্ছিক হলেও এর ডিফল্ট মান নেই have

এছাড়াও আপনি দুটি একত্রিত এবং একটি প্যারামিটার যে একটি ঐচ্ছিক যেখানে লাগে থাকতে পারে nilভালো ডিফল্ট মান হল: func test(param: Int? = nil)


27
"আপনি যদি একটি পরামিতি নির্দিষ্ট করেন যা alচ্ছিক, আপনাকে এটি সরবরাহ করতে হবে"। দুর্দান্ত, ধন্যবাদ সুইফ্ট
অ্যান্ড্রুওয়েবার

8
@ অ্যান্ড্রুটউবার আপনার হাস্যরসের প্রশংসা করেছেন, তবে নতুনদের জন্য, আমি ভেবেছিলাম এটি ব্যাখ্যা করতে সহায়ক হতে পারে যে "ptionচ্ছিক" কোনও বিষয় বা মান প্রদান বোঝায়। আপনাকে এটি করতে হবে না, আপনি পরিবর্তে শূন্য প্রদান করতে পারেন (যা কোনও বস্তুর বা মানের অভাবে প্রতিনিধিত্ব করে)। আপনি কেবল কোন বিকল্পটি বেছে নিচ্ছেন তা আপনাকে ঠিক করতে হবে।
জেডি স্যান্ডিফার

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)

এছাড়াও, এবং সরাসরি এই প্রশ্নের সাথে সম্পর্কিত নয়, তবে সম্ভবত লক্ষণীয়, আপনি সুইফটে সম্ভাব্য নীল বিকল্পগুলি মোকাবেলার জন্য সম্ভবত "নাল পয়েন্টারগুলি" ব্যবহার করার পদ্ধতিটি ব্যবহার করছেন। নিম্নলিখিত কোডটি নিরাপদ (বিশেষত মাল্টিথ্রেডিং সফ্টওয়্যারটিতে), এবং এটি আপনাকে alচ্ছিকের বাধ্যতামূলক আন-র্যাপিং এড়াতে সহায়তা করে:

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এবং ডিফল্ট থাকে, তবে এটি ফাংশন কল থেকে বাদ দেওয়া যেতে পারে বা অন্তর্ভুক্ত থাকতে পারে এবং শূন্যমূল্যের সাথে সরবরাহ করা যেতে পারে (যেমন প্যারাম 1: নীল)

আমি কি লেট বা ভেরিয়েবলের মতো চলক হিসাবে ডিফল্ট প্যারামিটার যুক্ত করতে পারি? ধন্যবাদ
যোগেশ প্যাটেল

@ যোগেশপ্যাটেল আপনার অর্থ কী তা নিশ্চিত নয়।
চক ক্রুটসিংগার

var myName = "যোগেশ" এর মতো। এখন, আমার ফাংশনটি 1 টির মতো fun 2. ফানক getFilterNames (নাম: স্ট্রিং = "যোগেশ")} approach এই পদ্ধতিরটি আমার পক্ষে কাজ করছে। তবে আমি প্রথমটি চাই তাই আপনি দয়া করে এটি অর্জনে আমাকে সহায়তা করতে পারেন। অনেক ধন্যবাদ!
যোগেশ প্যাটেল

@YogeshPatel আমার মনে হয় আপনি কি করতে পারেন func getFilterNames(name: inout String){ }যা আপনি নাম পাস হয় সংশোধন করার অনুমতি দেবে।
চাক Krutsinger

না না স্যার। আমি আমার প্যারামিটারটি পরিবর্তন করতে চাই না। আমি কেবলমাত্র আমার প্যারামিটারকে ডিফল্ট মান দিতে চাই তবে স্থির "যোগেশ" এর মতো না। আমি এর মত লেট নাম = "যোগেশ" গতিশীল ফানক getFilterNames (নাম: স্ট্রিং = নাম) এর মতো করতে চাই। এই স্যার পাচ্ছেন? ধন্যবাদ!
যোগেশ প্যাটেল

3

"Alচ্ছিক প্যারামিটার" অর্থ "এই প্যারামিটারের ধরন optionচ্ছিক"। এর অর্থ এই নয় যে "এই প্যারামিটারটি alচ্ছিক এবং অতএব, আপনি যখন ফাংশনটি কল করবেন তখন এড়ানো হবে"।

"Alচ্ছিক পরামিতি" শব্দটি বিভ্রান্তিকর বলে মনে হচ্ছে। স্পষ্ট করে বলতে গেলে, এখানে "alচ্ছিক" শব্দটি "asচ্ছিক প্যারামিটার" পরিবর্তে "optionচ্ছিক টাইপ প্যারামিটার" বলা আরও সঠিক, কেবলমাত্র প্যারামিটার মানের ধরণের বিবরণ এবং অন্য কিছুই নয়।


3

যদি আপনাকে একটি বুল পরম ব্যবহার করতে হয় তবে আপনার কেবলমাত্র ডিফল্ট মান নির্ধারণ করতে হবে।

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

তারপরে আপনি পরম ছাড়াই বা ব্যবহার করতে পারেন:

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

যে লোকেরা এটিকে স্বীকৃতি দেয় তাদের জন্য আপনি পরিবর্তে ভুল জিনিসটি ঠিক করতে পারেন, তাই অন্যরা বুঝতে পারে।
নিব ফৌদা

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

আপনি যখন সেই প্যারামিটারের জন্য alচ্ছিক প্যারামিটার এবং ডিফল্ট মান একত্রিত করার চেষ্টা করেন তখন তা খুব জটিল। এটার মত,

func test(param: Int? = nil)

এই দুটি সম্পূর্ণ বিপরীত ধারণা। আপনার যখন একটি typeচ্ছিক ধরণের প্যারামিটার থাকে তবে আপনি এটির জন্য ডিফল্ট মানও সরবরাহ করেন, এটির ডিফল্ট মান হওয়ায় এটি এখন আর optionচ্ছিক প্রকার নয় is ডিফল্ট শূন্য থাকলেও, ডিফল্ট মানটি কী তা যাচাই না করে সুইফট কেবলমাত্র alচ্ছিক বাঁধাই সরিয়ে দেয়।

সুতরাং শূন্যটিকে ডিফল্ট মান হিসাবে ব্যবহার না করা সর্বদা ভাল।


1
এটি ভুল। একটি optionচ্ছিকের ডিফল্ট মান (এমনকি nil) থাকাতে কোনও ভুল নেই ।
ব্রায়ান কেন্ডিগ

আমি যা বলছি একবার ভেরিয়েবলের একটি ডিফল্ট মান হয়, এটি বিবেচনায় এটি কোনও বিকল্প নয়, সর্বদা এর মান থাকবে।
শুভম নায়েক

1
এটি সত্য নয় এবং আপনি কী বর্ণনা করতে চাইছেন তা আমি নিশ্চিত নই। আমি মনে করি আপনি সঠিকভাবে বলছেন যে একবার কোনও ভেরিয়েবলের একটি মান নির্ধারিত হয়ে গেলে এটি সর্বদা নির্ধারিত হবে; আপনি এটি হস্তান্তর করতে পারবেন না (না আপনি চাইবেন না) যদি না আপনি এটিকে ডিফল্ট করেন। এবং যদি আপনি কোনও ভেরিয়েবলের মান (যেমন হিসাবে var foo: String; print(foo)) ব্যবহার করার চেষ্টা করেন তবে সুইফ্ট আপনাকে একটি সংকলন ত্রুটি দেবে । তবে ডিফল্ট মান সহ একটি ফাংশন আর্গুমেন্ট একটি alচ্ছিক আর্গুমেন্ট (আপনাকে এটি ফাংশন কলটিতে পাস করতে হবে না) এবং এটি ptionচ্ছিক ধরণেরও nilহতে পারে ( এমনকি এটি ডিফল্ট মান হিসাবে নির্ধারিত হতে দেওয়া হয়)।
ব্রায়ান কেনিগ

একটি ptionচ্ছিক মূলত ইউনিয়নের ধরণ <টাইপ | নিল>, অর্থাত্ এতে নির্দিষ্ট বর্ণ বা নীল প্রকার থাকতে পারে Type (ধরে নেওয়া যায় যে সুইফ্টের ইউনিয়ন রয়েছে, যা এটি নেই, তবে আমরা এখানে ধারণামূলকভাবে কথা বলছি)। এত ইন্টার? = নিল পুরোপুরি ঠিক আছে।
শায়নে

-1

ডিফল্ট মান বলতে ডেটা টাইপের ডিফল্ট মান বোঝায় না e এখানে ডিফল্ট মান অর্থের মান নির্ধারণের সময় সংজ্ঞায়িত হয় value ফাংশনে ভেরিয়েবল নির্ধারণের সময় আমাদের ভেরিয়েবলের ডিফল্ট মান ঘোষণা করতে হবে।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.