সুইফট আইএফ এলইটি কীভাবে মূল্যায়ন করা হয়?


90

আমি এই কোডটি এখানে সুইফট সাইট এবং বিভিন্ন পোস্টে দেখেছি এবং আমি বেসিকগুলি উপলব্ধি করার চেষ্টা করছি। এই রেখাটি কীভাবে মূল্যায়ন করা হয়?

if let name = optionalName {

এটির নাম == optionচ্ছিক নাম না হওয়ায় আমি বিভ্রান্ত হচ্ছি, এটির মূল্য নির্ধারণ করা হচ্ছে, তবে কীভাবে সেই প্রতিবেদনটি সত্য হয় এবং আপনি যদি জন আপেলসিলের সাথে শূন্যের জায়গায় প্রতিস্থাপন করেন তবে এটি কেন সমান হতে চলেছে?

var optionalName: String? = "John Appleseed"
var greeting = "Hello!"
if let name = optionalName {
    greeting = "Hello, \(name)"
}

10
সুইফ্ট ডকুমেন্টেশনে "inচ্ছিক বাঁধাই" সন্ধান করুন ...
মার্টিন আর

4
একটি সময়ে optionals দিকে তাকিয়ে বিশদ dev.iachieved.it/iachievedit/?p=314 , if letসিনট্যাক্স ঐচ্ছিক বাঁধাই হিসাবে পরিচিত হয়।
জো

উত্তর:


105

মূলত লাইনটি বলছে, "আপনি যদি নতুন ভেরিয়েবলটির nameঅপ্রয়োজনীয় সংস্করণের সমান করতে দিতে পারেন তবে এর optionalNameসাথে নিম্নলিখিতটি করুন"। মার্টিন যেমন উল্লেখ করেছেন, একে ptionচ্ছিক বাঁধাই বলা হয় ।

এর একমাত্র উদ্দেশ্য হ'ল পরীক্ষা করা যদি কোনও .চ্ছিক ভেরিয়েবলের আসল মান থাকে এবং অ-অ-variচ্ছিক ফর্মটি অস্থায়ী ভেরিয়েবলের সাথে আবদ্ধ করে। এটি একটি optionচ্ছিক "অন্য মোড়ক" র নিরাপদ উপায় বা অন্য কথায় optionচ্ছিকের মধ্যে থাকা মানটি অ্যাক্সেস করুন। এটি কোনওভাবেই কোনও ধরণের সাম্যের জন্য পরীক্ষা নয়। এটি কেবলমাত্র একটি withinচ্ছিকের মধ্যে একটি মানের অস্তিত্বের জন্য পরীক্ষা করা হয়।


4
আমি যখন এটিতে নেমে যাব তখন আমি তার একটি পঠন করব, আমি দ্রুত সুইডোর সূচনাতে এসেছি এবং এটি এটি ব্যাখ্যা করে না। আপনি ব্যাখ্যা নিখুঁত অর্থে তোলে, ধন্যবাদ।
ডেডজিরো


4
@ নুইবব কারণ if letআমরা যখন ব্যবহার করি তখন মানটিকে একটি অ- optionচ্ছিক পরিবর্তনশীল ( nameএই উদাহরণে) আবদ্ধ করি । আপনার উদাহরণটি সংকলন করবে না কারণ এখন কোনও ভেরিয়েবল বলা হয় না name। আপনি যদি আপনার উদাহরণটি ব্যবহারের জন্য পরিবর্তন করেন optionalNameতবে এটি প্রিন্ট হবে Hello, Optional("John Appleseed")। শূন্যতার বিরুদ্ধে চেক করার পরে আপনি জোর করে আন-র্যাপিং ব্যবহার করতে পারেন Hello, \(optionalName!)তবে কোডের এই অংশটি যদি আপনি কোনও চেক না করে সরিয়ে নেন তবে এটি কেবল আরও ত্রুটিযুক্ত।
ড্র্যাগ করুন

30

একটি eitherচ্ছিক হয় সেট করা হয় না সেট-সেট হয় (শূন্য বা শূন্য নয়) ... আমাদের একটি গুরুত্বপূর্ণ সিদ্ধান্ত রেখে। "আমাদের কোডটি কীভাবে লিখতে হবে যাতে এটি দুটি উভয় রাজ্যেরই সঠিকভাবে কাজ করতে পারে?" যেভাবে আমরা মোড়কে আছি করার আমাদের জন্য সিদ্ধান্ত নেয়।

এমন অনেকগুলি পন্থা রয়েছে যা আপনি একটি সেট না করা optionচ্ছিক মোকাবেলার জন্য ব্যবহার করতে পারেন।

  • ক্রাশ!
  • কোনও কিছুর কাছে মানটি ডিফল্ট করুন - যদি এটি সেট না করা থাকে।
  • অত্যন্ত শৃঙ্খলার ব্যর্থ অর্থাত কিছুই করতে, কিন্তু যদি মান সেট করা হয়, তাহলে এটি নির্ধারণ করুন।
  • অত্যন্ত শৃঙ্খলার ব্যর্থ অর্থাত কিছুই করতে অবশ্য যদি মান সেট করা হয় ... কিছু (এটা শুধু একটি একক নিয়োগ চেয়ে থাকবে)।

নীচে 4 টি পন্থা রয়েছে


জোর করে আন-র্যাপিং ব্যবহার করা ক্র্যাশ হয়ে যাবে যদি আপনার কোনও মান না থাকে। আপনি যদি এই মানটি গুরুত্ব সহকারে গুরুত্বের সাথে রাখেন তবে মুভিটির শিরোনাম (প্রতিটি সিনেমার একটি নাম থাকতে হবে) You !জোর করে আন-র্যাপিংয়ের জন্য ব্যবহৃত হয়।

movieTitle = movie.title!

নীল কোলেসিং ব্যবহার করা অন্য উপায় যা আপনাকে আরও নিয়ন্ত্রণ প্রদান করবে , মানে মান সেট না করা থাকলে এটি ক্রাশ হবে না এবং এটি সেট না করা থাকলে 'এটি কিছুই সেট করবে না' ... এটি আপনি যা বলবেন তাই করবে উদাহরণস্বরূপ, কোনও নাম সেট না থাকলে এটি শিরোনামহীন_মোভিতে মুভিটির নাম ডিফল্ট / সেট করে??নীল coalescing জন্য ব্যবহৃত হয়।

var movieTitle = movie.title ?? "untitled_Movie"

Youচ্ছিক চেইনিং ব্যবহার করা আপনার কোনও মান না থাকলে কিছুই করবে না এবং আপনার মান থাকলে মান সেট করবে । আপনি এমন কোনও কিছুর জন্য এটি করেন যা এর মান সেট করা অতীব গুরুত্বের নয় যেমন আপনার অভিনেতার এজেন্টের নাম?alচ্ছিক শৃঙ্খলা জন্য ব্যবহৃত হয়।

let agent = movie.leadActor?.agent //would not crash if you don't have a lead actor (optional chaining)
let agent = movie.leadActor!.agent //would crash if you don't have a lead Actor (forced wrapping)  

ব্যবহার if-let(বা guardযার দুটি ভিন্ন ধরনের হয় ঐচ্ছিক বাঁধাই ) আপনি দেব আরও নিয়ন্ত্রণ , এটা যদি মান সেট না করা হয় বিপর্যস্ত করা হবে না। মানটি সেট করা থাকলে আপনি কিছু করতে পারেন। যদি এটি সেট না করা থাকে তবে আপনি একটি elseবিবৃতি যুক্ত করতে পারেন ।

if let supportingActor = movie.supportingActor{
print(" The supporting actor is \(supportingActor)}

এটি মোড়ানোর জন্য সর্বাধিক ব্যবহৃত উপায়, কারণ জোর করে আন-র্যাপিং কিছুটা নিরুৎসাহিত করা হয়। কেন এটি নিরুৎসাহিত করা হয়েছে সে সম্পর্কে আরও আলোচনার জন্য এখানে দেখুন । মধ্যে একটি ভাল তুলনা জন্য guardএবং if-letদেখুনguard vs. if-let


সাইড নোট:

Ptionচ্ছিক বাঁধাই এবং chaচ্ছিক শৃঙ্খলা সাধারণত একসাথে ব্যবহৃত হয়:

if let agent = movie.leadActor?.agent {
ContactInfo = agent.phoneNumber
} // if-let is the optional *binding* part, the movie dot leadActor dot is the optional *chaining*
 

মুভি শিরোনাম কখনও স্ট্রিং ছাড়া অন্য কিছু হতে পারে না, এবং মুভি শিরোনামের জন্য সমস্ত স্ট্রিং বৈধ? (এবং আমি "শিরোনামহীন মুভি" আমি চাই "" চাই না) জোর করে আন-র্যাপিং করা এই পরিস্থিতির একমাত্র সঠিক উপায়, আপনি যদি সেই অংশটি মুছে ফেলতে পারেন তবে "জোর করে আন-র্যাপিং কিছুটা নিরুৎসাহিত করা হয়" যেটি মিথ্যা তথ্য বলে ।
অ্যান্ডি

মনে করুন আপনি একটি নেটওয়ার্ক কল করেছেন এবং সার্ভার দলের কিছু বিকাশকারী একটি খারাপ সিদ্ধান্ত নিয়েছেন এবং চলচ্চিত্রের শিরোনামটি ভুলে যেতে ভুলে গেছেন। আপনি কি চান আপনার অ্যাপ্লিকেশনটি উত্পাদনে ক্রাশ হোক? নাকি শুধু অজানা শিরোনাম লিখবেন? আসলে আইএমডিবিতে কয়েকটি চলচ্চিত্রের শিরোনাম নেই :)। অতিরিক্তভাবে জোর করে মোড়ানো বোঝাতে বোঝায় যে আপনি কোনও লগইন বা জোর দিয়েছিলেন নি। এটা খারাপ. কারণ আপনি জানেন না যে এর মূল কারণটি কী ছিল।
মধু

এটি একটি খড়ের লোকের যুক্তি, আমি কখনই বলিনি "জোর করে আন-র্যাপিং ব্যবহার করুন use" কেবলমাত্র আপনার উদাহরণটিতে জোর করে আন-র্যাপিং ব্যবহার করা উচিত নয়, এর অর্থ এই নয় যে প্রতিটি উদাহরণে জোর করে আন-র্যাপিংকে নিরুৎসাহিত করা হবে। আমি আপনাকে এমন একটি দৃশ্যাবলী দিয়েছি যেখানে আপনি যে চারটি উপস্থাপন করেছেন তার মধ্যে বাধ্যতামূলক আনরেপিংই হ'ল একমাত্র সঠিক সমাধান। আমার পূর্ববর্তী মন্তব্যে আপনি কি দৃশ্যের আরও ভাল সমাধান দিতে পারবেন? যদি তা না হয় তবে অনুগ্রহ করে বিবেচনা না করে "জোর করে আনরোপিং কিছুটা নিরুৎসাহিত করা" সম্পর্কে আপনার মন্তব্যটি সংশোধন করার বিষয়টি বিবেচনা করুন।
অ্যান্ডি

আপনি যদি কোনও কিছুকে "" এ ডিফল্ট করে থাকেন তবে তা আর কোনও বিকল্প নয়
হানি

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

4

যদি সিনট্যাক্স 2 বিভিন্ন শর্ত গ্রহণ করে। দ্বিতীয়টি, একটি alচ্ছিক বাঁধাই, বুলিয়ান নয়। এটি বিভ্রান্তিকর, যেমন আপনি লিখতে পারেন:

if let name = optionalName {

কিন্তু না

if (let name = optionalName) {

অ্যাপল ডকুমেন্টেশন (সুইফট রেফারেন্স):

মান শর্ত ধরনের হতে হবে Boolবা টাইপ সেতু নির্মাণ Bool। শর্ত এছাড়াও একটি ঐচ্ছিক বাঁধাই ঘোষণা, যেমন আলোচনা হতে পারে ঐচ্ছিক বাঁধাই


3

if এটি কেবল একটি বুলিয়ান এক্সপ্রেশন নেয়, অন্যটি এটি ত্রুটি ছুঁড়ে ফেলেছে তাই এই কোড স্নিপেট বলছে

if let name = optionalName {

}else{

}

optionচ্ছিক নাম যদি শূন্য হয় তবে শর্তটি মিথ্যা এবং অন্য বিবৃতি কার্যকর হবে। তবে ifচ্ছিক নামটির যদি কিছু মান থাকে তবে alচ্ছিক মানটি অবিচ্ছিন্ন / ধ্রুবক ভেরিয়েবলের নাম হিসাবে নির্ধারিত হয় name


1

যখনই আপনি সাথে কাজ করেন, দুর্বল রেফারেন্স, ঐচ্ছিক ধরনের এটা ব্যবহার করা ভাল হবে যদি এলইটি আপনার কোড এবং এড়ানোর নিরাপদ পাহারা জন্য এখানে ক্র্যাশ উদাহরণ হল

var middleName :String? = "some thing"
if let isExistsMiddleName = middleName {
// do some thing here
} else {
// no middle name
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.