সুইফটে একটি optionচ্ছিক মান কী?


267

থেকে অ্যাপলের ডকুমেন্টেশন :

আপনি যে মানগুলি অনুপস্থিত হতে পারে তার সাথে কাজ করতে ifএবং letএকত্রে ব্যবহার করতে পারেন । এই মানগুলি বিকল্প হিসাবে প্রতিনিধিত্ব করা হয়। একটি alচ্ছিক মান হয় হয় একটি মান থাকে বা nilমান অনুপস্থিত তা নির্দেশ করে। ?Valueচ্ছিক হিসাবে মান চিহ্নিত করতে একটি মানের ধরণের পরে একটি প্রশ্ন চিহ্ন ( ) লিখুন ।

আপনি কেন একটি alচ্ছিক মান ব্যবহার করতে চান?



1
Ptionচ্ছিকটিকে অপশন / হতে পারে মোনাডের প্রয়োগ হিসাবেও দেখা যেতে পারে । অন্যথায় একটি কঠিন ধারণা কী তা বোঝানোর চেষ্টা করার জন্য এখানে এই ব্লগটি একটি ভাল কাজ করে।
স্টুয়ার্টলসি 20'15

tldr: "কখন মানটি অনুপস্থিত হতে পারে এবং কখন এর অস্তিত্বের নিশ্চয়তা পাওয়া যায় সে সম্পর্কে সুইফ্টকে আপনার পরিষ্কার হওয়া দরকার” " নীভান রাজার দুর্দান্ত উত্তরটি থেকে
জোনাটান

উত্তর:


531

সুইফ্টে একটি alচ্ছিক হ'ল এক প্রকার যা মান বা কোনও মান রাখে না। বিকল্পগুলিকে ?কোনও প্রকারে যুক্ত করে লেখা হয় :

var name: String? = "Bertie"

বিকল্পগুলি (জেনারিক্স সহ) বোঝার জন্য সবচেয়ে কঠিন সুইফ্ট ধারণাগুলি। সেগুলি কীভাবে লিখিত এবং ব্যবহৃত হয় সেগুলির কারণে তারা কী সে সম্পর্কে একটি ভুল ধারণা পাওয়া সহজ। সাধারণ স্ট্রিং তৈরি করার জন্য উপরের alচ্ছিকের সাথে তুলনা করুন:

var name: String = "Bertie" // No "?" after String

সিনট্যাক্স থেকে দেখে মনে হচ্ছে anচ্ছিক স্ট্রিং একটি সাধারণ স্ট্রিংয়ের সাথে খুব মিল। এটা না। একটি alচ্ছিক স্ট্রিং কোনও স্ট্রিং নয় যা কিছু "alচ্ছিক" সেটিংস চালু আছে। এটি স্ট্রিংয়ের কোনও বিশেষ জাত নয়। একটি স্ট্রিং এবং একটি alচ্ছিক স্ট্রিং সম্পূর্ণ ভিন্ন ধরণের।

এখানে জানা সবচেয়ে গুরুত্বপূর্ণ বিষয়: একটি alচ্ছিক হ'ল এক ধরণের ধারক। একটি optionচ্ছিক স্ট্রিং একটি ধারক যা একটি স্ট্রিং থাকতে পারে। Optionচ্ছিক ইন্ট হ'ল একটি ধারক যা অন্তর্ভুক্ত থাকতে পারে। একধরণের পার্সেল হিসাবে alচ্ছিক ভাবেন। আপনি এটি খোলার আগে (বা ofচ্ছিকদের ভাষায় "মোড়ক") আপনি জানবেন না এতে কিছু আছে বা কিছুই নেই।

আপনি যে কোনও সুইফট ফাইলে "ptionচ্ছিক" টাইপ করে এবং এটিতে।-ক্লিক করে সুইফট স্ট্যান্ডার্ড লাইব্রেরিতে বিকল্পগুলি কীভাবে প্রয়োগ করা হয় তা দেখতে পাবেন। সংজ্ঞাটির গুরুত্বপূর্ণ অংশটি এখানে:

enum Optional<Wrapped> {
    case none
    case some(Wrapped)
}

Ptionচ্ছিক কেবল একটি enumযা দুটি ক্ষেত্রে একটি হতে পারে: .noneবা .some। যদি এটি হয় তবে এর সাথে .someসম্পর্কিত মান রয়েছে যা উপরের উদাহরণে String"হ্যালো" হবে। সম্পর্কিত মানটিতে একটি প্রকার দেওয়ার জন্য একটি usesচ্ছিক জেনেরিক্স ব্যবহার করে। একটি ঐচ্ছিক স্ট্রিং ধরণ নয় String, এটা Optional, অথবা আরো স্পষ্ট করে Optional<String>

বিকল্পগুলির সাথে সুইফট যা কিছু করে তা হ'ল পাঠ এবং লেখার কোডকে আরও সাবলীল করে তোলার জন্য যাদু। দুর্ভাগ্যক্রমে এটি বাস্তবে যেভাবে কাজ করে তা অস্পষ্ট করে। আমি কিছু কৌশল পরে যাব।

দ্রষ্টব্য: আমি optionচ্ছিক ভেরিয়েবল সম্পর্কে অনেক কথা বলব, তবে এটি optionচ্ছিক ধ্রুবকগুলি তৈরি করাও ঠিক। প্রকারের ধরণের তৈরি হচ্ছে তা বোঝার জন্য আমি তাদের ধরণের সাথে সমস্ত ভেরিয়েবল চিহ্নিত করি, তবে আপনাকে নিজের কোডে থাকতে হবে না।


বিকল্পগুলি কীভাবে তৈরি করবেন

Alচ্ছিক তৈরি করতে, ?আপনি যে ধরণের মোড়াতে চান তার পরে একটি যুক্ত করুন । যে কোনও ধরণের alচ্ছিক এমনকি আপনার নিজস্ব কাস্টম প্রকারও হতে পারে। টাইপ এবং এর মধ্যে আপনার কোনও স্থান থাকতে পারে না ?

var name: String? = "Bob" // Create an optional String that contains "Bob"
var peter: Person? = Person() // An optional "Person" (custom type)

// A class with a String and an optional String property
class Car {
var modelName: String // must exist
var internalName: String? // may or may not exist
}

বিকল্পগুলি ব্যবহার করে Using

nilএটির একটি মান আছে কিনা তা দেখার জন্য আপনি একটি alচ্ছিক তুলনা করতে পারেন:

var name: String? = "Bob"
name = nil // Set name to nil, the absence of a value
if name != nil {
    print("There is a name")
}
if name == nil { // Could also use an "else"
    print("Name has no value")
}

এটি কিছুটা বিভ্রান্তিকর। এটি বোঝায় যে anচ্ছিক হয় হয় একটি জিনিস বা অন্য কোনও। এটি হয় নিল বা এটি "বব"। এটি সত্য নয়, alচ্ছিক অন্য কিছুতে রূপান্তরিত করে না। এটিকে শূন্যের সাথে তুলনা করা সহজ-পড়ার কোডটি সহজ করার কৌশল। যদি একটি alচ্ছিক শূন্যের সমান হয় তবে এর অর্থ হ'ল এনাম বর্তমানে সেট করা আছে .none


কেবলমাত্র বিকল্পগুলি শূন্য হতে পারে

আপনি যদি শূন্যের জন্য একটি অ-alচ্ছিক ভেরিয়েবল সেট করার চেষ্টা করেন তবে আপনি একটি ত্রুটি পাবেন।

var red: String = "Red"
red = nil // error: nil cannot be assigned to type 'String'

বিকল্পগুলি দেখার আরেকটি উপায় হ'ল স্বাভাবিক সুইফ্ট ভেরিয়েবলের পরিপূরক হিসাবে। এগুলি একটি ভেরিয়েবলের প্রতিপক্ষ যা একটি মান থাকার গ্যারান্টিযুক্ত। সুইফ্ট একটি সতর্ক ভাষা যা অস্পষ্টতাকে ঘৃণা করে। বেশিরভাগ ভেরিয়েবলগুলি অ-বিকল্প হিসাবে সংজ্ঞায়িত করা হয় তবে কখনও কখনও এটি সম্ভব হয় না। উদাহরণস্বরূপ, এমন একটি ভিউ কন্ট্রোলার কল্পনা করুন যা কোনও ক্যাশে বা নেটওয়ার্ক থেকে কোনও চিত্র লোড করে। ভিউ কন্ট্রোলার তৈরি হওয়ার সময় এটিতে সেই চিত্র থাকতে পারে এবং নাও থাকতে পারে। ইমেজ ভেরিয়েবলের মানটির গ্যারান্টি দেওয়ার কোনও উপায় নেই। এই ক্ষেত্রে আপনাকে এটি itচ্ছিক করতে হবে। এটি শুরু হয় nilএবং যখন চিত্রটি পুনরুদ্ধার করা হয়, alচ্ছিক একটি মান পায়।

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


একটি alচ্ছিক ব্যবহার করতে, আপনি এটি "আনারপ" করুন

একটি বাস্তবের Stringজায়গায় ofচ্ছিক ব্যবহার করা যায় না String। Optionচ্ছিকের অভ্যন্তরে মোড়ানো মানটি ব্যবহার করতে, আপনাকে এটি মোছা আবশ্যক। Anচ্ছিক আন-মোড়কের সহজ উপায় হ'ল alচ্ছিক !নামের পরে যুক্ত করা । একে বলা হয় "জোর করে মোড়ানো"। এটি alচ্ছিক (মূল ধরণ হিসাবে) এর অভ্যন্তরে মানটি প্রদান করে তবে is nilচ্ছিক হলে এটি রানটাইম ক্র্যাশ ঘটায়। মোড়ক দেওয়ার আগে আপনার নিশ্চিত হওয়া উচিত যে এর কোনও মান আছে।

var name: String? = "Bob"
let unwrappedName: String = name!
print("Unwrapped name: \(unwrappedName)")

name = nil
let nilName: String = name! // Runtime crash. Unexpected nil.

Ckingচ্ছিক চেক করা এবং ব্যবহার করা

যেহেতু wচ্ছিকভাবে মোড়ানো এবং alচ্ছিক ব্যবহার করার আগে আপনার সর্বদা শূন্যের জন্য পরীক্ষা করা উচিত, এটি একটি সাধারণ প্যাটার্ন:

var mealPreference: String? = "Vegetarian"
if mealPreference != nil {
    let unwrappedMealPreference: String = mealPreference!
    print("Meal: \(unwrappedMealPreference)") // or do something useful
}

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

var mealPreference: String? = "Vegetarian"
if let unwrappedMealPreference: String = mealPreference {
    print("Meal: \(unwrappedMealPreference)") 
}

এটি একটি অস্থায়ী ধ্রুবক তৈরি করে (বা আপনি যদি প্রতিস্থাপন letকরেন তবে পরিবর্তনশীল var) যার স্কোপগুলি কেবল যদি ইফ এর ধনুর্বন্ধনীগুলির মধ্যে থাকে। "আনরোপডমিলিপ্রিফারেন্স" বা "রিয়েলমিলিপ্রিফারেন্স" এর মতো একটি নাম ব্যবহার করার কারণে, ব্র্যাকেটের স্কোপের মধ্যে একটি অস্থায়ী নাম তৈরি করে সুইফট আপনাকে মূল পরিবর্তনশীল নামটি পুনরায় ব্যবহার করতে দেয় allows

var mealPreference: String? = "Vegetarian"
if let mealPreference: String = mealPreference {
    print("Meal: \(mealPreference)") // separate from the other mealPreference
}

একটি ভিন্ন ভেরিয়েবল ব্যবহৃত হয় তা দেখানোর জন্য এখানে কিছু কোড রয়েছে:

var mealPreference: String? = "Vegetarian"
if var mealPreference: String = mealPreference {
    print("Meal: \(mealPreference)") // mealPreference is a String, not a String?
    mealPreference = "Beef" // No effect on original
}
// This is the original mealPreference
print("Meal: \(mealPreference)") // Prints "Meal: Optional("Vegetarian")"

Alচ্ছিক বাঁধাই checkingচ্ছিক শূন্য হয় কিনা তা পরীক্ষা করে পরীক্ষা করে কাজ করে। যদি এটি না হয় তবে এটি সরবরাহকৃত ধ্রুবকটির মধ্যে alচ্ছিকটিকে আবদ্ধ করে এবং ব্লকটি কার্যকর করে। এক্সকোড ৮.৩ এবং তারপরে (সুইফট ৩.১) এ, এটির মতো anচ্ছিক প্রিন্ট করার চেষ্টা করা একটি অকেজো সতর্কতা সৃষ্টি করবে। debugDescriptionএটি নিঃশব্দ করতে alচ্ছিক ব্যবহার করুন :

print("\(mealPreference.debugDescription)")

বিকল্পগুলি কী কী?

বিকল্পগুলির দুটি ব্যবহারের কেস রয়েছে:

  1. যে জিনিসগুলি ব্যর্থ হতে পারে (আমি কিছু আশা করছিলাম তবে আমি কিছুই পাইনি)
  2. যে জিনিসগুলি এখন কিছুই নয় তবে পরে কিছু হতে পারে (এবং তদ্বিপরীত)

কিছু দৃ concrete় উদাহরণ:

  • একটি সম্পত্তি যা আছে বা না থাকতে পারে, মত middleNameবা spouseএকটি Personশ্রেণী
  • একটি পদ্ধতি যা কোনও মান বা কিছুই ফিরিয়ে আনতে পারে, যেমন অ্যারেতে ম্যাচ সন্ধান করার মতো
  • একটি পদ্ধতি যা ফলাফল দেয় বা ত্রুটি পেতে পারে এবং কিছুই ফিরিয়ে দিতে পারে না, যেমন কোনও ফাইলের বিষয়বস্তু পড়ার চেষ্টা করা (যা সাধারণত ফাইলটির ডেটা ফেরত দেয়) তবে ফাইলটি বিদ্যমান নেই
  • প্রতিনিধি বৈশিষ্ট্য, যা সর্বদা সেট করতে হবে না এবং সাধারণত আরম্ভের পরে সেট করা থাকে
  • weakক্লাসে সম্পত্তি জন্য । তারা যে বিষয়টি নির্দেশ করে তা nilযে কোনও সময় সেট করা যেতে পারে
  • একটি বৃহত সংস্থান যা মেমরি পুনরুদ্ধার করতে মুক্তি দিতে পারে
  • যখন কখন কোনও মান সেট করা হয়েছে তা জানতে (ডেটা এখনও লোড করা হয়নি> ডেটা) ডেটা আলাদা ডাটা ব্যবহারের পরিবর্তে প্রয়োজন Boolean

উদ্দেশ্যসমূহ-সিতে বিকল্পগুলির অস্তিত্ব নেই তবে এখানে একটি সমমানের ধারণা রয়েছে, ফিরে আসার শূন্য রয়েছে। যে পদার্থগুলি কোনও বস্তুকে ফেরত দিতে পারে তার পরিবর্তে শূন্য করতে পারে। এর অর্থ "একটি বৈধ অবজেক্টের অনুপস্থিতি" বোঝাতে নেওয়া হয় এবং প্রায়শই এটি কিছু ভুল হয়ে গেছে বলে ব্যবহৃত হয়। এটি কেবল অবজেক্টিভ-সি অবজেক্টের সাথে কাজ করে, আদিম বা বেসিক সি-টাইপগুলি (এনামস, স্ট্রাক্ট) দিয়ে নয়। উদ্দেশ্য-সি এর প্রায়শই এই মানগুলির অনুপস্থিতি উপস্থাপনের জন্য বিশেষ ধরনের ( NSNotFoundযা সত্যই NSIntegerMax, kCLLocationCoordinate2DInvalidএকটি অবৈধ স্থানাঙ্কের প্রতিনিধিত্ব করতে, -1বা কিছু নেতিবাচক মানও ব্যবহৃত হয়) থাকে। কোডারকে এই বিশেষ মানগুলি সম্পর্কে জানতে হবে যাতে তাদের প্রতিটি মামলার জন্য ডকুমেন্টেড এবং শিখতে হবে। যদি কোনও পদ্ধতি nilপ্যারামিটার হিসাবে নিতে না পারে তবে এটি নথিভুক্ত করতে হবে। উদ্দেশ্য-সি তে,nilপয়েন্টার হিসাবে সমস্ত বস্তু যেমন পয়েন্টার হিসাবে সংজ্ঞায়িত করা হয়েছিল তবে nilনির্দিষ্ট (শূন্য) ঠিকানার দিকে নির্দেশিত হয়েছিল। সুইফটে, nilএকটি আক্ষরিক যার অর্থ একটি নির্দিষ্ট ধরণের অনুপস্থিতি।


তুলনা nil

আপনি এই হিসাবে যে কোনও alচ্ছিক ব্যবহার করতে সক্ষম হতেন Boolean:

let leatherTrim: CarExtras? = nil
if leatherTrim {
    price = price + 1000
}

সুইফটের আরও সাম্প্রতিক সংস্করণগুলিতে আপনাকে ব্যবহার করতে হবে leatherTrim != nil। কেন? সমস্যাটি হ'ল একটি Booleananচ্ছিকভাবে মোড়ানো যায়। আপনার যদি এটির Booleanমতো থাকে:

var ambiguous: Boolean? = false

এর দুটি ধরণের "মিথ্যা" রয়েছে, একটি যেখানে মূল্য নেই এবং একটি যেখানে এর মান রয়েছে তবে মানটি false। সুইফ্ট অস্পষ্টতাকে ঘৃণা করে তাই এখন আপনাকে অবশ্যই সর্বদা একটি alচ্ছিক বিরুদ্ধে পরীক্ষা করতে হবে nil

আপনি ভাবতে পারেন যে anচ্ছিকের Booleanমূল বিষয়টি কী? অন্যান্য বিকল্পগুলির মতো .noneরাজ্যও ইঙ্গিত দিতে পারে যে মানটি এখনও অজানা। নেটওয়ার্ক কলের অপর প্রান্তে এমন কিছু কিছু থাকতে পারে যা পোল করতে কিছুটা সময় নেয়। Alচ্ছিক বুলিয়ানদের " ত্রি-মান বুলিয়ানস "ও বলা হয়


দ্রুত কৌশল

বিকল্পগুলি কাজ করার জন্য সুইফট কিছু কৌশল ব্যবহার করে। সাধারণ দেখতে optionচ্ছিক কোডের এই তিনটি লাইন বিবেচনা করুন;

var religiousAffiliation: String? = "Rastafarian"
religiousAffiliation = nil
if religiousAffiliation != nil { ... }

এই লাইনের কোনওটিই সংকলন করা উচিত নয়।

  • প্রথম লাইনটি স্ট্রিং আক্ষরিক, দুটি ভিন্ন ধরণের ব্যবহার করে একটি alচ্ছিক স্ট্রিং সেট করে। এমনকি এটির Stringপ্রকারগুলি আলাদা হলেও
  • দ্বিতীয় লাইনটি একটি alচ্ছিক স্ট্রিংকে শূন্য করে, দুটি ভিন্ন ধরণের সেট করে
  • তৃতীয় লাইন একটি optionচ্ছিক স্ট্রিংকে শূন্যের সাথে তুলনা করে, দুটি ভিন্ন ধরণের

আমি বিকল্পগুলির প্রয়োগের কিছু বিবরণ যাব যা এই লাইনগুলিকে কাজ করতে দেয়।


Anচ্ছিক তৈরি করা

?একটি alচ্ছিক তৈরি করতে ব্যবহার করা সিনট্যাকটিক চিনি, সুইফ্ট সংকলক দ্বারা সক্ষম। আপনি যদি এটি দীর্ঘতর করতে চান তবে আপনি এটির মতো একটি alচ্ছিক তৈরি করতে পারেন:

var name: Optional<String> = Optional("Bob")

এটি কলটির Optionalপ্রথম ইনিশিয়ালাইজার, public init(_ some: Wrapped)যা প্রথম বন্ধনীগুলির মধ্যে ব্যবহৃত ধরণের থেকে .চ্ছিক সম্পর্কিত সম্পর্কিত ধরণের অনুভূত করে।

Creatingচ্ছিক তৈরি এবং সেট করার আরও দীর্ঘতর উপায়:

var serialNumber:String? = Optional.none
serialNumber = Optional.some("1234")
print("\(serialNumber.debugDescription)")

একটি alচ্ছিক সেট করা হচ্ছে nil

আপনি কোনও প্রাথমিক মান ছাড়াই alচ্ছিক তৈরি করতে পারেন, বা প্রাথমিক মান সহ একটি তৈরি করতে পারেন nil(উভয়েরই একই ফলাফল রয়েছে)।

var name: String?
var name: String? = nil

সমানতে বিকল্প বিকল্পগুলি nilপ্রোটোকল ExpressibleByNilLiteral(পূর্বে নামযুক্ত NilLiteralConvertible) দ্বারা সক্ষম করা হয়েছে । OptionalSecondচ্ছিকটি তৈরি করা হয় এর দ্বিতীয় সূচক public init(nilLiteral: ()),। দস্তাবেজগুলি বলে যে আপনাকে বিকল্পগুলি ExpressibleByNilLiteralব্যতীত অন্য কোনও কিছুর জন্য ব্যবহার করা উচিত নয় , যেহেতু এটি আপনার কোডটিতে শূন্যতার অর্থ পরিবর্তন করে, তবে এটি করা সম্ভব:

class Clint: ExpressibleByNilLiteral {
    var name: String?
    required init(nilLiteral: ()) {
        name = "The Man with No Name"
    }
}

let clint: Clint = nil // Would normally give an error
print("\(clint.name)")

একই প্রোটোকল আপনাকে ইতিমধ্যে তৈরি alচ্ছিক এটিকে সেট করতে দেয় nil। যদিও এটি প্রস্তাবিত নয়, আপনি সরাসরি শূন্য আক্ষরিক প্রাথমিক ব্যবহার করতে পারেন:

var name: Optional<String> = Optional(nilLiteral: ())

একটি alচ্ছিক তুলনা nil

বিকল্পগুলি দুটি বিশেষ "==" এবং "! =" অপারেটর সংজ্ঞায়িত করে, যা আপনি Optionalসংজ্ঞায় দেখতে পাচ্ছেন । প্রথমটি ==আপনাকে কোনও বৈকল্পিক শূন্যের সমান কিনা তা পরীক্ষা করতে দেয়। .None এ সেট করা দুটি পৃথক বিকল্প সবসময় সমান হবে যদি সম্পর্কিত ধরণেরগুলি একই হয়। যখন আপনি শূন্যের সাথে তুলনা করেন, নেপথ্যে পর্দার পিছনে সুইফট একই জাতীয় প্রকারের একটি alচ্ছিক তৈরি করে।

// How Swift actually compares to nil
var tuxedoRequired: String? = nil
let temp: Optional<String> = Optional.none
if tuxedoRequired == temp { // equivalent to if tuxedoRequired == nil
    print("tuxedoRequired is nil")
}

দ্বিতীয় ==অপারেটর আপনাকে দুটি বিকল্পের তুলনা করতে দেয়। উভয়ই একই ধরণের হতে হবে এবং সেই ধরণের সাথে সামঞ্জস্য করা দরকার Equatable(প্রোটোকল যা নিয়মিত "==" অপারেটরের সাথে জিনিসগুলির তুলনা করতে দেয়)। সুইফ্ট (সম্ভবত) দুটি মানকে আবৃত করে এবং সরাসরি তাদের তুলনা করে। এটি বিকল্প বা এক বা উভয়ই ক্ষেত্রে কেস পরিচালনা করে .nonenilআক্ষরিক তুলনা মধ্যে পার্থক্য নোট করুন ।

তদ্ব্যতীত, এটি Equatableআপনাকে কোনও প্রকারকে alচ্ছিক মোড়কে সেই ধরণের তুলনা করতে দেয় :

let numberToFind: Int = 23
let numberFromString: Int? = Int("23") // Optional(23)
if numberToFind == numberFromString {
    print("It's a match!") // Prints "It's a match!"
}

পর্দার আড়ালে, সুইফ্ট তুলনা করার আগে অ-alচ্ছিককে মোড়ক দেয়। এটি আক্ষরিক সাথেও কাজ করে ( if 23 == numberFromString {)

আমি বলেছিলাম যে দুটি ==অপারেটর রয়েছে, কিন্তু আসলে তৃতীয়টি রয়েছে যা আপনাকে nilতুলনার বাম দিকে রাখার অনুমতি দেয়

if nil == name { ... }

নামকরণ বিকল্প

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


সরকারী সংজ্ঞা

থেকে "বুনিয়াদি" এ সুইফট প্রোগ্রামিং ভাষা :

সুইফট optionচ্ছিক প্রকারগুলিও প্রবর্তন করে, যা কোনও মানের অভাবকে পরিচালনা করে। বিকল্পগুলি হয় বলে যে "একটি মান আছে এবং এটি x এর সমান" বা "এর কোনও মান হয় না"। বিকল্পগুলি উদ্দেশ্য-সি-তে পয়েন্টার সহ শূন্য ব্যবহার করার মতো, তবে তারা কেবল ক্লাস নয়, কোনও ধরণের জন্য কাজ করে। অপশনালগুলি অবজেক্টিভ-সি এর নীল পয়েন্টারগুলির চেয়ে নিরাপদ এবং আরও অভিব্যক্তিপূর্ণ এবং সুইফটের অনেক শক্তিশালী বৈশিষ্ট্যগুলির কেন্দ্রবিন্দুতে।

বিকল্পগুলি হ'ল সত্য যে সুইফট একটি প্রকার সুরক্ষিত ভাষা। আপনার কোডটি যে ধরণের মানগুলির সাথে কাজ করতে পারে সে সম্পর্কে স্যুইফ্ট আপনাকে পরিষ্কার হতে সহায়তা করে। যদি আপনার কোডের কোনও অংশ স্ট্রিংয়ের প্রত্যাশা করে তবে প্রকার সুরক্ষা আপনাকে ভুল করে এটি কোনও আন্তঃ পাস করতে বাধা দেয়। এটি আপনাকে উন্নয়ন প্রক্রিয়াতে যত তাড়াতাড়ি সম্ভব ত্রুটিগুলি ধরা এবং ঠিক করতে সক্ষম করে।


শেষ করতে এখানে 1899 সালের বিকল্প সম্পর্কে একটি কবিতা রয়েছে:

গতকাল সিঁড়ির উপরে
আমি এমন এক ব্যক্তির সাথে সাক্ষাত হয়েছিল যিনি সেখানে
ছিলেন না তিনি আজ
আর সেখানে ছিলেন না আমার ইচ্ছা, আমি আশা করি তিনি
অ্যান্টিগনিশকে দূরে সরিয়ে
দিতেন


আরও সংস্থানসমূহ:


5
@ ক্যানডেদেগলু দুর্ভাগ্যক্রমে স্টিভ অনেকটা optionচ্ছিক। তিনি এখানে ছিলেন এবং এখন তিনি নেই।
নেভান রাজা

19
if myStringআর সংকলন করে না আপনি প্রয়োজন if myString != nilডকুমেন্টেশন দেখুন ।
প্যাং করুন

5
জন্য সেরা এবং স্পষ্ট ব্যাখ্যা? এবং ! ওয়েবে আমি সুইফটে ব্যবহার করেছি। আপনাকে ধন্যবাদ
মাইন্ডবম্ব

2
ম্যাথিও গভীরতার সাথে বিকল্পগুলি ব্যাখ্যা করে, গভীরতা এবং সহজ উদাহরণগুলিতে পৌঁছে।
ইলুভাটার_জিআর

4
এই ব্যাখ্যার জন্য আপনাকে ধন্যবাদ, এটি অ্যাপলের নিজস্ব ডকুমেন্টেশনের চেয়ে অনেক পরিষ্কার।
Yesthisisjoe

16

আসুন একটির উদাহরণ নেওয়া যাক NSError, যদি কোনও ত্রুটি ফেরত না আসে তবে আপনি নীলকে ফেরত দেওয়ার জন্য এটি alচ্ছিক করতে চান। যদি কোনও ত্রুটি না থাকে তবে এটির জন্য কোনও মূল্য নির্ধারণের কোনও অর্থ নেই ..

var error: NSError? = nil

এটি আপনাকে একটি ডিফল্ট মান রাখতেও সহায়তা করে। সুতরাং আপনি কোনও পদ্ধতিটি ডিফল্ট মান সেট করতে পারেন যদি ফাংশনটি কোনও কিছু পাস না করে

func doesntEnterNumber(x: Int? = 5) -> Bool {
    if (x == 5){
        return true
    } else {
        return false
    }
}

"যদি এটি শূন্য হয় তবে এর সাথে কোনও অভিব্যক্তির ফলাফলও শূন্য হয়" বাক্যটি সহজভাবে ভুল। বিকল্পের মানটি প্রকাশের পরেও উপস্থিত func isNil<T>(t: T?) -> Bool { return t == nil }হবে । truenil
সত্য

অবিশ্বাস্যভাবে খারাপ কোড নমুনা। আপনি কি আরও ভাল কিছু ভাবতে পারেন না? কেন সহজভাবে নয় return x == 5? 5 এ সম্পর্কে বিশেষ কী?
অ্যাটমস্ক

না, 2 বছর আগে আমি এর চেয়ে ভাল কিছু ভাবতে পারি নি। আজ হ্যাঁ, তবে এটি কি পয়েন্টটি পেয়েছে? হ্যাঁ. @ অটোমস্ক ইনপুট দেওয়ার জন্য ধন্যবাদ, এটি সত্যই সহায়ক।
জন রিসেলভাতো

12

আপনার একটি পরিবর্তনশীল থাকতে পারে না যা nilসুইফটে নির্দেশ করে - কোনও পয়েন্টার নেই, এবং কোনও নাল পয়েন্টার নেই। তবে একটি এপিআই-তে আপনি প্রায়শই কোনও নির্দিষ্ট ধরণের মান, বা মানের ঘাটতি বোঝাতে সক্ষম হতে চান - যেমন আমার উইন্ডোটির কোনও প্রতিনিধি আছে এবং যদি তাই হয় তবে কে? বিকল্পগুলি হ'ল সুইফটের টাইপ-নিরাপদ, মেমরি-নিরাপদ উপায় এটি করার জন্য।


11

আমি একটি সংক্ষিপ্ত উত্তর দিয়েছি, এটি আমার উপরে যে অনিশ্চয়তা ছিল তা শিক্ষানবিস হিসাবে পরিষ্কার করার জন্য উপরের বেশিরভাগ অংশকে সংযুক্ত করে:

অবজেক্টিভ-সি-এর বিপরীতে, কোনও ভেরিয়েবল সুইফটে শূন্য করতে পারে না, সুতরাং ptionচ্ছিক চলক প্রকারটি যুক্ত হয়েছিল ("?" দ্বারা সংযুক্ত ভেরিয়েবলগুলি):

    var aString = nil //error

বড় পার্থক্যটি হ'ল ptionচ্ছিক ভেরিয়েবলগুলি সরাসরি মানগুলি সংরক্ষণ করে না (একটি সাধারণ ওবজে-সি ভেরিয়েবলগুলি হিসাবে) তাদের দুটি অবস্থা থাকে : " একটি মান আছে " বা " হ'ল শূন্য ":

    var aString: String? = "Hello, World!"
    aString = nil //correct, now it contains the state "has nil"

এই সত্তা, আপনি বিভিন্ন পরিস্থিতিতে এই পরিবর্তনগুলি পরীক্ষা করতে পারেন:

if let myString = aString? {
     println(myString)
}
else { 
     println("It's nil") // this will print in our case
}

"!" ব্যবহার করে! প্রত্যয়, আপনি সেগুলিতে মুড়ে থাকা মানগুলিও অ্যাক্সেস করতে পারেন, যদি সেগুলি বিদ্যমান থাকে । (যেমন এটি শূন্য নয় ):

let aString: String? = "Hello, World!"
// var anotherString: String = aString //error
var anotherString: String = aString!

println(anotherString) //it will print "Hello, World!"

এজন্য আপনার "ব্যবহার" করা দরকার? এবং "!" এবং সেগুলি সমস্ত ডিফল্টরূপে ব্যবহার করবেন না। (এটি ছিল আমার সবচেয়ে বড় বিস্ময়কর ঘটনা)

আমি উপরের উত্তরের সাথেও একমত: ptionচ্ছিক প্রকারটি বুলিয়ান হিসাবে ব্যবহার করা যায় না


7

অবজেক্টিভ সি সি ভেরিয়েবলগুলির সাথে কোনও মান নেই ('নীল' মানগুলি 0 এবং মিথ্যা হিসাবে ব্যবহার করাও সম্ভব ছিল) সুতরাং শর্তাধীন বিবৃতিতে ভেরিয়েবলগুলি ব্যবহার করা সম্ভব ছিল (ভেরিয়েবলগুলির মানগুলি 'সত্য হিসাবে সমান হয়) 'এবং কোনও মান নেই তাদের' FALSE 'সমান))।

সুইফট 'alচ্ছিক মান' সরবরাহ করে ধরণের সুরক্ষা সরবরাহ করে। অর্থাত্‍ এটি বিভিন্ন ধরণের ভেরিয়েবল নির্ধারণ থেকে ত্রুটিগুলি প্রতিরোধ করে।

সুতরাং সুইফ্টে, শর্তাধীন বিবৃতিতে কেবল বুলিয়ান সরবরাহ করা যায়।

var hw = "Hello World"

এখানে, যদিও 'এইচডাব্লু' একটি স্ট্রিং, এটি যদি স্টেটমেন্ট সি-এর মতো একটি স্টেটমেন্টে ব্যবহার করা যায় না

//This is an error

if hw

 {..}

তার জন্য এটি তৈরি করা দরকার,

var nhw : String? = "Hello World"

//This is correct

if nhw

 {..}

5

.চ্ছিক মান আপনাকে মানটির অভাব দেখাতে দেয়। সামান্য কিছুটা এসকিউএল-তে NULL বা অবজেক্টিভ-সি-তে এনএসএন-এর মতো। আমার ধারণা এটির উন্নতি হবে কারণ আপনি এটি "আদিম" প্রকারের জন্যও ব্যবহার করতে পারেন।

// Reimplement the Swift standard library's optional type
enum OptionalValue<T> {
    case None
    case Some(T)
}
var possibleInteger: OptionalValue<Int> = .None
possibleInteger = .Some(100)

এর উত্স: অ্যাপল ইনক। "দ্য সুইফ্ট প্রোগ্রামিং ভাষা।" iBooks। https://itun.es/gb/jEUH0.l


6
nilএনাম ধ্রুবকটির জন্য কেবল সিনট্যাকটিক চিনি OptionalValue<T>.None(যেখানে Tআপনি ব্যবহার করছেন সেই প্রসঙ্গে উপযুক্ত টাইপটি কোথায় nil)। ?এর জন্য একটি শর্টকাট OptionalValue<T>.Some(T)
রিক্সার

4

একটি alচ্ছিক মানে সুইফট পুরোপুরি নিশ্চিত নয় যে মানটি ধরণের সাথে মিলে যায়: উদাহরণস্বরূপ, ইন্ট? এর অর্থ হ'ল সুইফ্টটি পুরোপুরি নিশ্চিত নয় যে সংখ্যাটি কোনও ইন্ট হয় কিনা।

এটিকে সরাতে, এমন তিনটি পদ্ধতি রয়েছে যাতে আপনি নিয়োগ করতে পারেন।

1) আপনি যদি প্রকারের বিষয়ে পুরোপুরি নিশ্চিত হন তবে আপনি এটিকে জোর করে মোড়ানো করতে বিস্মিত চিহ্নটি ব্যবহার করতে পারেন:

// Here is an optional variable:

var age: Int?

// Here is how you would force unwrap it:

var unwrappedAge = age!

আপনি যদি জোর করে কোনও unচ্ছিক আন-মোড়ক করেন এবং এটি শূন্যের সমান হয়, আপনি এই ক্র্যাশ ত্রুটির মুখোমুখি হতে পারেন:

এখানে চিত্র বর্ণনা লিখুন

এটি অগত্যা নিরাপদ নয়, সুতরাং আপনার পদ্ধতি এবং মান সম্পর্কে নিশ্চিত না হলে এমন একটি পদ্ধতি এখানে ক্র্যাশ হওয়া রোধ করতে পারে:

এই সমস্যাটির বিরুদ্ধে 2 এবং তিনটি পদ্ধতি রক্ষা করুন।

2) সুস্পষ্টভাবে মোড়কযুক্ত alচ্ছিক

 if let unwrappedAge = age {

 // continue in here

 }

নোট করুন যে মোড়কযুক্ত টাইপটি এখন ইন্টের পরিবর্তে ইন্ট হয়?

3) গার্ড বিবৃতি

 guard let unwrappedAge = age else { 
   // continue in here
 }

এখান থেকে, আপনি এগিয়ে যেতে পারেন এবং মোড়ানো মোড়কটি ব্যবহার করতে পারেন। যদি আপনি ভেরিয়েবলের ধরণের বিষয়ে নিশ্চিত হন তবে কেবল আনার্পিং (একটি দিয়ে!) জোর করে তা নিশ্চিত করুন।

আপনার প্রকল্পের সাথে সৌভাগ্য কামনা করছি!


1

যখন আমি শিখতে শুরু করি তখন Swiftএটি কেন alচ্ছিক তা অনুধাবন করা খুব কঠিন ছিল

এই ভাবে চিন্তা করি। আসুন এমন একটি শ্রেণি বিবেচনা করা যাক Personযার দুটি সম্পত্তি nameএবং company

class Person: NSObject {

    var name : String //Person must have a value so its no marked as optional
    var companyName : String? ///Company is optional as a person can be unemployed that is nil value is possible

    init(name:String,company:String?) {

        self.name = name
        self.companyName = company

    }
}

এখন এর কয়েকটি অবজেক্ট তৈরি করতে দিন Person

var tom:Person = Person.init(name: "Tom", company: "Apple")//posible
var bob:Person = Person.init(name: "Bob", company:nil) // also Possible because company is marked as optional so we can give Nil

কিন্তু আমরা পাস Nilকরতে পারি নাname

var personWithNoName:Person = Person.init(name: nil, company: nil)

এখন আমরা কেন ব্যবহার করি সে সম্পর্কে কথা বলা যাক optional?Incসংস্থার নাম যেমন appleহবে তার পরে আমরা যুক্ত করতে চাই এমন একটি পরিস্থিতি বিবেচনা করি apple Inc। আমাদের Incসংস্থার নাম এবং মুদ্রণের পরে সংযোজন করতে হবে ।

print(tom.companyName+" Inc") ///Error saying optional is not unwrapped.
print(tom.companyName!+" Inc") ///Error Gone..we have forcefully unwrap it which is wrong approach..Will look in Next line
print(bob.companyName!+" Inc") ///Crash!!!because bob has no company and nil can be unwrapped.

এখন studyচ্ছিকভাবে কেন জায়গা নেয় তা অধ্যয়ন করতে দিন।

if let companyString:String = bob.companyName{///Compiler safely unwrap company if not nil.If nil,no unwrap.

    print(companyString+" Inc") //Will never executed and no crash!!!
}

এর bobসাথে প্রতিস্থাপন করা যাকtom

if let companyString:String = tom.companyName{///Compiler safely unwrap company if not nil.If nil,no unwrap.

    print(companyString+" Inc") //Will never executed and no crash!!!
}

এবং অভিনন্দন! আমরা সঠিকভাবে মোকাবেলা করেছিoptional?

সুতরাং উপলব্ধি পয়েন্ট হয়

  1. আমরা যদি কোনও ভেরিয়েবলকে alচ্ছিক হিসাবে চিহ্নিত করতে পারি তবে এটির সম্ভব যদি হয় nil
  2. যদি আমরা কোডটি সংকলনের কোথাও এই ভেরিয়েবলটি ব্যবহার করতে চাইলে আপনাকে মনে করিয়ে দেবে যে আমাদের যদি সেই ভেরিয়েবলের সাথে সঠিক ডিল আছে কিনা তা যাচাই করতে হবে nil

ধন্যবাদ ... শুভ কোডিং


0

নীচের কোডটি প্লেগ্রাউন্ড সহ পরীক্ষা- নিরীক্ষা করতে দিন

var sampleString: String? ///Optional, Possible to be nil

sampleString = nil ////perfactly valid as its optional

sampleString = "some value"  //Will hold the value

if let value = sampleString{ /// the sampleString is placed into value with auto force upwraped.

    print(value+value)  ////Sample String merged into Two
}

sampleString = nil // value is nil and the

if let value = sampleString{

    print(value + value)  ///Will Not execute and safe for nil checking
}

//   print(sampleString! + sampleString!)  //this line Will crash as + operator can not add nil

0

Https://developer.apple.com/library/content/docamentation/Swift/Conceptual/Swift_Programming_Language/OptionalChaining.html থেকে :

Alচ্ছিক শৃঙ্খলা বৈশিষ্ট্য, পদ্ধতি এবং একটি বিকল্পের সাবস্ক্রিপ্টগুলি অনুসন্ধান এবং কল করার জন্য একটি প্রক্রিয়া যা বর্তমানে শূন্য হতে পারে। Theচ্ছিকতে যদি কোনও মান থাকে, সম্পত্তি, পদ্ধতি বা সাবস্ক্রিপ্ট কল সফল হয়; theচ্ছিক যদি শূন্য হয়, সম্পত্তি, পদ্ধতি বা সাবস্ক্রিপ্ট কলটি শূন্য করে। একাধিক ক্যুরিয়াস একসাথে বেঁধে রাখা যেতে পারে, এবং যদি চেইনের কোনও লিঙ্ক শূন্য থাকে তবে পুরো শৃঙ্খলা কৃপণভাবে ব্যর্থ হয়।

আরও গভীরভাবে বুঝতে, উপরের লিঙ্কটি পড়ুন।


0

আমরা হব...

? (Ptionচ্ছিক) নির্দেশ করে আপনার ভেরিয়েবলের সাথে শূন্যতার পরিমাণ থাকতে পারে ! (আনল্যাপার) ইঙ্গিত করে যে আপনার চলকটিতে রানটাইম ব্যবহার করার সময় এটির (এটি থেকে কোনও মান পাওয়ার চেষ্টা করা) স্মৃতি (বা মান) থাকতে হবে।

প্রধান পার্থক্য হ'ল alচ্ছিক শৃঙ্খলা যখন nচ্ছিক শূন্য হয় তখন করুণভাবে ব্যর্থ হয়;

Chaচ্ছিক শৃঙ্খলা নীল মানতে ডেকে আনা যায় এই সত্যটি প্রতিফলিত করতে, chaচ্ছিক চেইনিং কলের ফলাফল সর্বদা একটি valueচ্ছিক মান, এমনকি যে সম্পত্তি, পদ্ধতি বা সাবস্ক্রিপ্ট আপনি জিজ্ঞাসা করছেন তা যদি একটি নিঃশর্ত মান দেয়। Thisচ্ছিক চেইনিং কলটি সফল হয়েছিল কিনা তা যাচাই করতে আপনি এই .চ্ছিক রিটার্ন মানটি ব্যবহার করতে পারেন (প্রত্যাবর্তিত alচ্ছিকটিতে একটি মান রয়েছে), বা শৃঙ্খলে শূন্যতার কারণে সফল হয়নি (প্রত্যাবর্তিত alচ্ছিক মানটি শূন্য)।

বিশেষত, chaচ্ছিক চেইনিং কলের ফলাফল প্রত্যাশিত রিটার্ন মান হিসাবে একই ধরণের, তবে anচ্ছিকভাবে আবৃত। একটি সম্পত্তি যা সাধারনত কোনও INT ফেরত দেয় কোনও INT ফেরত দেবে ? যখন alচ্ছিক শৃঙ্খলা মাধ্যমে অ্যাক্সেস করা হয়।

var defaultNil : Int?  // declared variable with default nil value
println(defaultNil) >> nil  

var canBeNil : Int? = 4
println(canBeNil) >> optional(4)

canBeNil = nil
println(canBeNil) >> nil

println(canBeNil!) >> // Here nil optional variable is being unwrapped using ! mark (symbol), that will show runtime error. Because a nil optional is being tried to get value using unwrapper

var canNotBeNil : Int! = 4
print(canNotBeNil) >> 4

var cantBeNil : Int = 4
cantBeNil = nil // can't do this as it's not optional and show a compile time error

অ্যাপল বিকাশকারী কমিটি কর্তৃক বিশদ সম্পর্কিত প্রাথমিক টিউটোরিয়ালটি এখানে রয়েছে: ptionচ্ছিক চেইনিং


0

সুইফ্টে একটি alচ্ছিক হ'ল এক প্রকার যা মান বা কোনও মান রাখে না। অপশন যুক্ত করে এ যুক্ত করে লেখা হয় ? যে কোনও ধরণের:

var name: String?

আপনি গভীরভাবে জ্ঞান পেতে এই লিঙ্কটি উল্লেখ করতে পারেন: https://medium.com/@agoiabeladeyemi/optionals-in-swift-2b141f12f870


-1

এখানে সুইফটে একটি সমমানের alচ্ছিক ঘোষণা:

var middleName: String?

এই ঘোষণাটি স্ট্রিংয়ের মধ্যম নাম নামের একটি ভেরিয়েবল তৈরি করে। স্ট্রিং ভেরিয়েবল প্রকারের পরে প্রশ্ন চিহ্ন (?) ইঙ্গিত দেয় যে মাঝের নাম ভেরিয়েবলের একটি মান থাকতে পারে যা স্ট্রিং বা শূন্য হতে পারে। এই কোডটি দেখে যে কেউ তত্ক্ষণাত জানে যে মিডলনামটি শূন্য হতে পারে। এটি স্ব-ডকুমেন্টিং!

আপনি যদি কোনও alচ্ছিক ধ্রুবক বা পরিবর্তনশীল (উপরে বর্ণিত হিসাবে) জন্য প্রাথমিক মান নির্দিষ্ট না করেন তবে মানটি স্বয়ংক্রিয়ভাবে আপনার জন্য শূন্য হয়ে যায়। আপনি যদি পছন্দ করেন তবে আপনি প্রাথমিক মানটি পরিষ্কারভাবে নির্ধারণ করতে পারেন:

var middleName: String? = nil

নীচের লিঙ্কে readচ্ছিক পড়ার জন্য আরও বিশদের জন্য

http://www.iphonelife.com/blog/31369/swift-101-working-swifts-new-optional-values


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