সুইফট ভাষায় বিস্মৃত চিহ্নটির অর্থ কী?


518

সুইফ্ট প্রোগ্রামিং ভাষা নির্দেশিকাতে নিম্নলিখিত উদাহরণ রয়েছে:

class Person {
    let name: String
    init(name: String) { self.name = name }
    var apartment: Apartment?
    deinit { println("\(name) is being deinitialized") }
}

class Apartment {
    let number: Int
    init(number: Int) { self.number = number }
    var tenant: Person?
    deinit { println("Apartment #\(number) is being deinitialized") }
}

var john: Person?
var number73: Apartment?

john = Person(name: "John Appleseed")
number73 = Apartment(number: 73)

//From Apple's “The Swift Programming Language” guide (https://developer.apple.com/library/content/documentation/Swift/Conceptual/Swift_Programming_Language/AutomaticReferenceCounting.html)

তারপরে কোনও ব্যক্তিকে অ্যাপার্টমেন্ট দেওয়ার সময়, তারা "দৃষ্টান্তটি মোছার জন্য" একটি বিস্ময়কর বিন্দু ব্যবহার করে:

john!.apartment = number73

"উদাহরণটি মোড়ানো" এর অর্থ কী? কেন এটি প্রয়োজনীয়? কেবলমাত্র নিম্নলিখিতগুলি করা থেকে এটি কীভাবে আলাদা:

john.apartment = number73

আমি সুইফট ভাষাতে খুব নতুন। কেবল বেসিকগুলি নামানোর চেষ্টা করছি।


আপডেট:
আমি যে ধাঁধাটি হারিয়েছিলাম তার বড় অংশটি (উত্তরে সরাসরি বর্ণিত হয়নি - কমপক্ষে এটি লেখার সময় নয়) আপনি যখন নিম্নলিখিতটিগুলি করেন:

var john: Person?

এর অর্থ এই নয় যে " johnটাইপ টাইপ Personএবং এটি শূন্য হতে পারে", যেমনটি আমি মূলত ভেবেছিলাম। আমি কেবল এটি ভুল বুঝেছিলাম Personএবং Person?সম্পূর্ণ পৃথক ধরণের separate একবার আমি বুঝতে পেরেছিলাম যে, অন্যান্য সমস্ত ?, !উন্মাদনা এবং নীচের দুর্দান্ত উত্তরগুলি আরও অনেক অর্থবোধ করেছে।

উত্তর:


530

"উদাহরণটি মোড়ানো" এর অর্থ কী? কেন এটি প্রয়োজনীয়?

আমি যতদূর কাজ করতে পারি (এটি আমার কাছেও খুব নতুন) ...

শব্দ "আবৃত" বোঝা আমরা উচিত একটি উপহার হিসাবে একটি ঐচ্ছিক পরিবর্তনশীল, চকচকে কাগজে মোড়া, যা পারে (দুঃখিতভাবে!) খালি হতে মনে

যখন "মোড়ানো" হয়, তখন একটি ptionচ্ছিক ভেরিয়েবলের মান একটি এনাম হয় দুটি সম্ভাব্য মান (বুলিয়ান এর মতো কিছুটা)। এই এনামটি বর্ণনা করে যে ভেরিয়েবলের মান ( Some(T)) রয়েছে কিনা , (না None)।

যদি কোনও মান থাকে, তবে এটি ভেরিয়েবলটি "মোড়ানো" (এর Tথেকে প্রাপ্ত করে Some(T)) দ্বারা পাওয়া যায়।

এর john!.apartment = number73থেকে আলাদা কীভাবে john.apartment = number73? (Paraphrased)

আপনি যদি কোনও ptionচ্ছিক চলকটির নাম লিখেন (যেমন পাঠ্য john, ছাড়াই !), তবে এটি "মোড়ানো" এনাম (কিছু / কিছুই নয়) বোঝায়, মান নিজেই (টি) নয়। সুতরাং এটির johnউদাহরণ Personনয় এবং এর কোনও apartmentসদস্য নেই:

john.apartment
// 'Person?' does not have a member named 'apartment'

আসল Personমানটি বিভিন্ন উপায়ে আবদ্ধ হতে পারে:

  • "জোর করে আন-র্যাপিং": john!( Personএটি উপস্থিত থাকলে মান দেয় , রানটাইম ত্রুটি যদি শূন্য থাকে)
  • "alচ্ছিক বাঁধাই": if let p = john { println(p) }( printlnমান উপস্থিত থাকলে কার্যকর করে)
  • "alচ্ছিক শৃঙ্খলা": john?.learnAboutSwift()(মান বিদ্যমান থাকলে এই তৈরি পদ্ধতি প্রয়োগ করে)

আমি অনুমান করি যে নীল ক্ষেত্রে কী ঘটতে হবে এবং কীভাবে সম্ভব তা নির্ভর করে আপনি মোড়কানোর জন্য এই উপায়গুলির মধ্যে একটি বেছে নিয়েছেন। এই ভাষার নকশাটি নীল কেসটিকে স্পষ্টভাবে পরিচালনা করতে বাধ্য করে, যা আমি মনে করি ওবজ-সি এর চেয়ে সুরক্ষার উন্নতি করে (যেখানে নীল কেসটি পরিচালনা করা ভুলে যাওয়া সহজ)।

আপডেট :

বিস্ময়কর চিহ্নটি "সংক্ষিপ্ত আকারে মোড়ানো বিকল্পগুলি" ঘোষণার জন্য বাক্য গঠনতেও ব্যবহৃত হয়।

এখনও পর্যন্ত উদাহরণগুলিতে, johnচলকটি হিসাবে ঘোষণা করা হয়েছে var john:Person?এবং এটি একটি anচ্ছিক। আপনি যদি সেই পরিবর্তনশীলটির আসল মান চান তবে উপরের তিনটি পদ্ধতির মধ্যে একটি ব্যবহার করে আপনাকে অবশ্যই এটি আবরণে আনতে হবে।

যদি এটির var john:Person!পরিবর্তে ঘোষণা করা হয় তবে ভেরিয়েবলটি একটি সুস্পষ্টভাবে মোড়কজাত ptionচ্ছিক (অ্যাপলের বইয়ের এই শিরোনামের অংশটি দেখুন)। মান অ্যাক্সেস করার সময় এই ধরণের ভেরিয়েবলটিকে মোড়ক করার দরকার নেই এবং johnঅতিরিক্ত বাক্য বিন্যাস ছাড়াই ব্যবহার করা যেতে পারে। তবে অ্যাপলের বই বলে:

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

আপডেট 2 :

মাইক অ্যাশের লেখা " আকর্ষণীয় সুইফট বৈশিষ্ট্যগুলি " নিবন্ধটি optionচ্ছিক ধরণের জন্য কিছুটা অনুপ্রেরণা দেয়। আমি মনে করি এটি দুর্দান্ত, পরিষ্কার লেখা writing

আপডেট 3 :

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

ভবিষ্যতে অ্যাপল তাদের কাঠামোগত মাধ্যমে ঝুঁটি মারতে পারে, স্পষ্টভাবে মোড়কযুক্ত ("সম্ভবত কখনই নয়") প্যারামিটারগুলির অনিশ্চয়তা দূর করে এবং তাদের বিকল্পের সাথে প্রতিস্থাপন করবে ("অবশ্যই বিশেষত [আশাবাদী, নথিভুক্ত!] পরিস্থিতি") বা স্ট্যান্ডার্ড নন তাদের উদ্দেশ্য-সি কোডের যথাযথ আচরণের উপর ভিত্তি করে বিচ্ছিন্নকরণ ("কখনই শূন্য নয়") ঘোষণা।


আমি এই ব্যাখ্যা সম্পর্কে নিশ্চিত নই। আপনি যদি কেবল কোডটি চালান না করে! এটি এখনও প্রকৃত মান প্রদান করে। হতে পারে! গতির জন্য?
রিচার্ড ওয়াশিংটন

ঠিক আছে. সুতরাং ডক্স ব্যবহার সম্পর্কে কথা! আপনি যখন নিশ্চিতভাবে জানবেন যে এটি মোড়ানো যায়। তবে আপনি কোডটি এটি ছাড়াই সূক্ষ্মভাবে চালাতে পারেন (আপনার তালিকার জন্য একটি বিকল্প বিকল্প - অন্তর্নিহিত আনারপ্যাটিং) এবং প্রথমে যাচাই না করেই। আপনি মানটি ফিরে পাবেন বা যদি শূন্য হয় তবে নিল। তবে আপনি যদি নিশ্চিতভাবে জানেন যে এটি শূন্য নয় তবে ব্যবহার করুন! ...... তবে আমি এখনও দেখতে পাচ্ছি না আপনি কেন এটি করবেন?
রিচার্ড ওয়াশিংটন

2
হাই @ রিচার্ড ওয়াশিংটন - আমি আমার উত্তরে একটি আপডেট যুক্ত করেছি যা আশা করি এটির কিছু স্পষ্ট করে।
অ্যাশলে

আপডেট 3 হ'ল আমি যা খুঁজছি। এটি পড়ার আগে আমি ভেবেছিলাম অ্যাপল মিথ্যা কথা বলছিল যখন তারা এনএসআরএল ক্রেনডেনশিয়ালের মতো কিছু ফিরিয়ে দিয়েছে! যা আসলে শূন্য হতে পারে।
গোল্ডেন থাম্ব

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

127

এখানে আমি মনে করি পার্থক্য:

var john: Person?

মানে জন নিল হতে পারে

john?.apartment = number73

সংকলক এই রেখাকে ব্যাখ্যা করবে:

if john != nil {
    john.apartment = number73
}

যদিও

john!.apartment = number73

সংকলক এই রেখাকে সহজভাবে ব্যাখ্যা করবে:

john.apartment = number73

সুতরাং, ব্যবহার করে! যদি বিবৃতিটি মোড়ক করে তা দ্রুত চালিত করে তোলে, তবে জন যদি শূন্য হয়, তবে রানটাইম ত্রুটি ঘটবে।

সুতরাং এখানে মোড়ানো মানে এই নয় যে এটি মেমরি মোড়ানো, তবে এর অর্থ এটি কোড মোড়ানো, এই ক্ষেত্রে এটি যদি একটি বিবৃতি দিয়ে আবৃত হয়, এবং কারণ অ্যাপল রানটাইমের সময় পারফরম্যান্সের উপর গভীর মনোযোগ দেয়, তারা আপনাকে একটি উপায় দিতে চায় আপনার অ্যাপটিকে সেরা সম্ভাব্য পারফরম্যান্স দিয়ে চালিত করুন make

হালনাগাদ:

4 বছর পরে এই উত্তরে ফিরে আসার সাথে সাথে স্ট্যাকওভারফ্লোতে যেহেতু আমি এটির থেকে সর্বাধিক খ্যাতি পেয়েছি :) আমি সেই সময় মোড়ক খোলার অর্থটি কিছুটা ভুল বুঝি। এখন 4 বছর পরে আমি বিশ্বাস করি যে এখানে আনারপ্যাটিংয়ের অর্থ কোডটি এর মূল কমপ্যাক্ট ফর্ম থেকে প্রসারিত করা। এছাড়াও এর অর্থ that বস্তুর চারপাশে অস্পষ্টতা অপসারণ করা, কারণ আমরা এটির সংজ্ঞা দিয়ে নিশ্চিত নই বা না। ঠিক উপরের অ্যাশলির উত্তরের মতো, এটিকে এমন একটি বর্তমান হিসাবে ভাবুন যা এতে কিছুই থাকতে পারে না। তবে আমি এখনও মনে করি যে মোড়কটি হ'ল কোড আন-র্যাপিং এবং এনুম ব্যবহার হিসাবে মেমরি ভিত্তিক আন-র্যাপিং নয়।


9
আমার খেলার মাঠে john.apartment = সংখ্যা 73 সংকলন করে না, আপনি অবশ্যই জনকে নির্দিষ্ট করতে হবে?। অ্যাপার্টমেন্ট = সংখ্যা 73
চক পিংকার্ট

2
@ চকপিংকার্ট ঠিক আছে, ৪ র্থ লাইনটি জনকে সম্পাদনা করা উচিত? অ্যাপার্টমেন্ট = সংখ্যা ,73, যদিও সুন্দর উত্তর!
ব্রুস

john.apartment = number73 ত্রুটি দেয়: Persচ্ছিক টাইপের মান 'ব্যক্তি?' আবদ্ধ না: আপনার ব্যবহারের অর্থ কি '!' বা '?'?
স্পাইডারম্যান

4
মোড়ক খোলার পক্ষে আর্ট পারফরম্যান্স করার কিছুই নেই। "নীল চেক" এখনও রানটাইম করতে হবে, একমাত্র পার্থক্য হ'ল runচ্ছিক ক্ষেত্রে কোনও মান উপস্থিত না থাকলে একটি রানটাইম ত্রুটি নিক্ষেপ করা হবে।
ম্যাডিডিয়ার

67

টি এল; ডিআর

সুইফট ভাষায় বিস্মৃত চিহ্নটির অর্থ কী?

বিস্ময়কর চিহ্নটি কার্যকরভাবে বলেছে, “আমি জানি যে এই alচ্ছিকটির অবশ্যই একটি মূল্য রয়েছে; দয়া করে এটি ব্যবহার করুন। " এটি বিকল্পের মানটি জোর করে আন-র্যাপিং হিসাবে পরিচিত:

উদাহরণ

let possibleString: String? = "An optional string."
print(possibleString!) // requires an exclamation mark to access its value
// prints "An optional string."

let assumedString: String! = "An implicitly unwrapped optional string."
print(assumedString)  // no exclamation mark is needed to access its value
// prints "An implicitly unwrapped optional string."

সূত্র: https://developer.apple.com/library/content/docamentation/Swift/Conceptual/Swift_Programming_Language/TheBasics.html#//apple_ref/doc/uid/TP40014097-CH5-XID_399


11
আপনার উত্তরটি দুর্দান্ত কারণ আমি বুঝতে পারি যে এখন কী চলছে। আমি যা বুঝতে পারি না তা হ'ল অন্তর্নিহিত বিকল্পগুলি কেন বিদ্যমান। নিয়মিত স্ট্রিং টাইপের পরিবর্তে কেন একটি স্পষ্টভাবে মোড়কযুক্ত alচ্ছিক স্ট্রিং হিসাবে সংজ্ঞায়িত কিছু তৈরি করবেন? তারপরে তাদের ব্যবহার একই। আমি কী মিস করছি?
পাচুন

এটি আর সত্য বলে মনে হয় না। একটি সুইফ্ট 5 রিপ্লাই-এ, যদি আমি করি let f: String! = "hello"এবং তারপরে print(f)আউটপুটটি কেবল ন্যায়বিচারের Optional("hello")পরিবর্তে হয় "hello"
নম্বরমানিয়াক

37

জন যদি একটি alচ্ছিক ভার (এইভাবে ঘোষণা করা) হত

var john: Person?

তারপরে জনের পক্ষে কোনও মূল্য না থাকা সম্ভব (ওবিজিসি পার্লেন্সে, শূন্যমূল্যে)

বিস্ময়কর বিন্দুটি মূলত সংকলককে বলে "আমি জানি এটির একটি মূল্য আছে, এটির জন্য আপনাকে পরীক্ষা করার দরকার নেই"। আপনি যদি এটি ব্যবহার করতে না চান তবে আপনি শর্তসাপেক্ষে এটি পরীক্ষা করতে পারেন:

if let otherPerson = john {
    otherPerson.apartment = number73
}

এর অভ্যন্তরটি তখনই মূল্যায়ন করবে যদি জন এর কোন মূল্য থাকে।


4
প্রতিক্রিয়াটির জন্য ধন্যবাদ, আমি এখন বুঝতে পেরেছি যে উদ্দীপনা চিহ্নটি কী বলে, আমি এখনও আমার মাথাটি কেন জড়িয়ে রাখার চেষ্টা করছি ... কেন আপনি বলেছেন যে এটি সংকলককে বলেছে "আমি জানি এটির একটি মূল্য আছে, আপনার পরীক্ষা করার দরকার নেই এটি "। সংকলক এর জন্য পরীক্ষা না করলে এটি আমাকে কী কিনে? বিস্ময়কর বিন্দু ব্যতীত, সংকলকটি কি কোনও ত্রুটি ফেলবে (আমার কোনও পরিবেশ নেই, তবে আমি সুইফট পরীক্ষা করতে পারি)? হয় ! সমস্ত alচ্ছিক যুদ্ধের জন্য 100% প্রয়োজনীয়? যদি তা হয় তবে অ্যাপল কেন এটিকে ঘৃণা করেছিল, কেবল এটি তৈরির বিপরীতে যেমন অভাব ! এর অর্থ "আমি জানি এটির একটি মূল্য আছে, এটির জন্য আপনাকে পরীক্ষা করার দরকার নেই"?
ট্রয়

"সংকলকটি একটি ত্রুটি ফেলতে চলেছে" - এটি এখনও প্রত্যাশার মতো মান প্রত্যাবর্তনের পক্ষে কাজ করে না। আমি এই না। হয় ! শুধু গতির জন্য আপনি যখন নিশ্চিত হন?
রিচার্ড ওয়াশিংটন

প্রকৃতপক্ষে ডক্সে নীচের উদাহরণটি ব্যবহার করে সুস্পষ্টভাবে মোড়কযুক্ত বিকল্পগুলি সম্পর্কে কথা বলা হয়: “let possibleString: String? = "An optional string." println(possibleString!) // requires an exclamation mark to access its value // prints "An optional string.” তবে এটি না দিয়ে ঠিক কাজ করে! এখানে কিছু অদ্ভুত বলে মনে হচ্ছে।
রিচার্ড ওয়াশিংটন

3
@ রিচার্ড ওয়াশিংটন আপনি ভাল কারণে বিভ্রান্ত হয়েছেন! দস্তাবেজের উদাহরণগুলি কিছু জিনিস রেখে দিচ্ছে এবং বিভ্রান্ত করছে কারণ তারা যা কিছু করে তা প্রিন্টলন ব্যবহার করে। স্পষ্টতই, কমপক্ষে কয়েকটি দৃষ্টান্ত রয়েছে যেখানে বিকল্পগুলি খোলার প্রয়োজন নেই। একটি হ'ল প্রিন্টলন ব্যবহার করার সময়। আর একটি হ'ল স্ট্রিং ইন্টারপোলেশন ব্যবহার করার সময়। সুতরাং, সম্ভবত প্রিন্টলন এবং স্ট্রিং ইন্টারপোলেশনগুলি কভারগুলির নীচে খাড়া হয়ে যাচ্ছে? এই সম্পর্কে কারও বেশি অন্তর্দৃষ্টি রয়েছে। এক্সকোড 6 বিটা শিরোনামের সংজ্ঞাগুলি দেখানো আমার কাছে এই যাদু সম্পর্কে কিছুই প্রকাশ করে নি।
mbeaty

হ্যাঁ, আমি এটি পেয়েছি John?এবং Johnদুটি ভিন্ন ধরণের। এর মধ্যে একটি হ'ল ptionচ্ছিক ব্যক্তি এবং অন্য প্রকার ব্যক্তি type আপনি ব্যক্তিকে আউট করতে পারার আগে ptionচ্ছিক ব্যক্তিকে আন-আপ করা দরকার। তবে আপনি যেমনটি বলেছেন, বাস্তবে কিছুই না করে এই পরিস্থিতিতে অন্তত এমনটি ঘটবে বলে মনে হচ্ছে। এটি মনে হচ্ছে! অপ্রয়োজনীয়। না হলে! সংকলন সময়ের ত্রুটিগুলি ধরার জন্য সর্বদা alচ্ছিক তবে একটি প্রস্তাবিত জিনিস। নির্দিষ্ট ধরণের বার / বরাদ্দ করার মতো ধরণ স্পষ্ট করা যায় let John: Person = ...তবে অনুমান করা যায় let John = ...
রিচার্ড ওয়াশিংটন

27

অন্যান্য দরকারী তবে আরও বিশদ-কেন্দ্রিক উত্তরগুলিতে যুক্ত করতে কিছু বড় চিত্রের দৃষ্টিভঙ্গি:

সুইফটে, বিস্মৃত বিবরণটি বিভিন্ন প্রসঙ্গে প্রদর্শিত হবে:

  • জোর করে আনরোপিং: let name = nameLabel!.text
  • সুস্পষ্টভাবে মোড়কযুক্ত বিকল্পগুলি: var logo: UIImageView!
  • জোর করে ingালাই: logo.image = thing as! UIImage
  • অপরিশোধিত ব্যতিক্রমগুলি: try! NSJSONSerialization.JSONObjectWithData(data, [])

এগুলির প্রত্যেকেরই আলাদা ভাষা বোঝার সাথে আলাদা অর্থ রয়েছে তবে তাদের তিনটির মধ্যে তিনটি গুরুত্বপূর্ণ বিষয় রয়েছে:

1. বিস্মৃত বিবরণগুলি সুইফটের সংকলন-সময় সুরক্ষা চেকগুলি বাতিল করে circum

আপনি যখন !সুইফটে ব্যবহার করেন, আপনি মূলত বলে যাচ্ছেন, "আরে, সংকলক, আমি জানি আপনি কি মনে করেন যে এখানে কোনও ত্রুটি ঘটতে পারে তবে আমি নিশ্চিতভাবে জানি যে এটি কখনই ঘটবে না।"

সমস্ত বৈধ কোড সুইফটের সংকলন-টাইপ টাইপ সিস্টেমের বাক্সে ফিট করে না - বা কোনও ভাষার স্ট্যাটিক ধরণের চেকিংয়ের জন্য matter এমন পরিস্থিতি রয়েছে যেখানে আপনি যুক্তিযুক্তভাবে প্রমাণ করতে পারেন যে কোনও ত্রুটি কখনই ঘটবে না, তবে আপনি এটি সংকলকটিতে প্রমাণ করতে পারবেন না । এই কারণেই সুইফটের ডিজাইনাররা এই বৈশিষ্ট্যগুলি প্রথম স্থানে যুক্ত করেছিলেন।

যাইহোক, আপনি যখনই ব্যবহার করবেন !, আপনি কোনও ত্রুটির জন্য পুনরুদ্ধার পথ পাচ্ছেন না, যার অর্থ ...

২. বিস্মৃত বিবরণগুলি হ'ল সম্ভাব্য ক্রাশ।

একটি বিস্ময় বিন্দুতে আরও বলা হয়েছে, "আরে সুইফ্ট, আমি এতটাই নিশ্চিত যে এই ত্রুটিটি কখনই ঘটতে পারে না যে এটির জন্য পুনরুদ্ধারের পথটি কোড করা আমার চেয়ে আমার পুরো অ্যাপটি ক্র্যাশ করা আপনার পক্ষে ভাল ” "

এটি একটি বিপজ্জনক দাবি এটা তোলে করতে মিশন-ক্রিটিকাল কোড যেখানে আপনি আপনার কোডের invariants সম্পর্কে হার্ড চিন্তা আছে, এটা হতে পারে যে বাজে আউটপুট একটি ক্র্যাশ চেয়ে খারাপ হল: সঠিক এক হতে।

যাইহোক, আমি যখন !বন্য দেখতে পাই , এটি খুব কমই এত মনযোগ দিয়ে ব্যবহার করা হয়। পরিবর্তে, এটির প্রায়শই অর্থ হয়, "এই মানটি wasচ্ছিক ছিল এবং আমি কেন এটি নিলাম হতে পারে বা কীভাবে সঠিকভাবে সেই পরিস্থিতিটি পরিচালনা করতে পারি সে সম্পর্কে খুব কঠিন চিন্তা করিনি , তবে যুক্ত !করে এটি সংকলন করে দিয়েছে ... তাই আমার কোডটি সঠিক, তাই না?"

বিস্ময়কর বিন্দুর অহংকার থেকে সাবধান থাকুন। পরিবর্তে…

৩. বিস্ময়বোধক পয়েন্টগুলি খুব কম ব্যবহার করা হয়।

এই !কনস্ট্রাক্টের প্রত্যেকটিরই একটি অংশ রয়েছে ?যা আপনাকে ত্রুটি / শূন্য মামলা মোকাবেলা করতে বাধ্য করে:

  • শর্তসাপেক্ষ আনরেপিং: if let name = nameLabel?.text { ... }
  • Optionals: var logo: UIImageView?
  • শর্তসাপেক্ষ জাল: logo.image = thing as? UIImage
  • শূন্য-ব্যর্থতা ব্যতিক্রম: try? NSJSONSerialization.JSONObjectWithData(data, [])

আপনি যদি ব্যবহার করতে প্ররোচিত হন তবে আপনি পরিবর্তে !কেন ব্যবহার করছেন না তা সাবধানতার সাথে বিবেচনা করা ভাল ?!অপারেশন ব্যর্থ হলে আপনার প্রোগ্রামটি ক্রাশ করা কি সর্বোত্তম বিকল্প ? কেন সেই মানটি alচ্ছিক / উপলভ্য?

আপনার কোড শূন্য / ত্রুটির ক্ষেত্রে গ্রহণযোগ্য কোনও পুনরুদ্ধার পথ আছে কি? যদি তাই হয় তবে কোড দিন

যদি এটি শূন্য নাও হতে পারে, ত্রুটিটি কখনই না ঘটতে পারে, তবে আপনার যুক্তিটি পুনরায় কাজ করার কোনও যুক্তিযুক্ত উপায় আছে যাতে সংকলক তা জানে? যদি তা হয় তবে তা করুন; আপনার কোড কম ত্রুটি-প্রবণ হবে।

এমন সময় আছে যখন কোনও ত্রুটি পরিচালনা করার কোনও যুক্তিসঙ্গত উপায় নেই, এবং কেবল ত্রুটিটিকে উপেক্ষা করে - এবং এভাবে ভুল ডেটা নিয়ে এগিয়ে যাওয়া - ক্রাশ হওয়ার চেয়ে খারাপ হতে পারে । সেই সময়ের বল unwrapping ব্যবহার করতে হয়।

আমি পর্যায়ক্রমে এর পুরো !ব্যবহারের জন্য আমার সম্পূর্ণ কোডবেস অনুসন্ধান এবং এটির নিরীক্ষণ করি। খুব কম ব্যবহারের জন্য যাচাই বাছাই করা যায়। (এই লেখা হিসাবে, পুরো সিয়স্তার কাঠামোর ঠিক দুটি উদাহরণ রয়েছে))

বলতে হচ্ছে না আপনার উচিত না ব্যবহার !আপনার কোডে - শুধু আপনি এটি ব্যবহার করা উচিত সমনোযোগে , এবং এটি ডিফল্ট বিকল্প কখনোই ভুলবেন না।


func isSubscriptionActive(receiptData: NSDictionary?) -> Bool { if(receiptData == nil) { return false; } return (hasValidTrial(receiptData!) || isNotExpired(receiptData!)) && isNotCancelled(receiptData!) } প্রদত্ত 3. এটি লেখার আরও ভাল উপায় আছে কি?
জেনসন-বাটন-ইভেন্ট

আপনি বলতে পারেনfunc isSubscriptionActive(receiptData: NSDictionary?) -> Bool { guard let nonNilReceiptData = receiptData else { return false} return (hasValidTrial(nonNilReceiptData) || isNotExpired(nonNilReceiptData)) && isNotCancelled(nonNilReceiptData) }
rkgibson2

বিস্ময়কর চিহ্নগুলি কোনও সুরক্ষা পরীক্ষা পরীক্ষা করে না। Alচ্ছিক শূন্য হলে আপনি গ্যারান্টিযুক্ত ক্র্যাশ পান। ঐচ্ছিক করা হয় সবসময় চেক। এটি একটি সুরক্ষা চেক করার খুব নিষ্ঠুর উপায়।
gnasher729

@ gnasher729 যেমন উত্তরটি বলেছে, এটি নিরাপদ রানটাইম ব্যর্থতার পক্ষে সংকলিত -সময় সুরক্ষা চেকগুলি বাতিল করে ।
পল কেন্ট্রেল

24

johnএকটি .চ্ছিক var। সুতরাং একটি nilমান থাকতে পারে । মানটি নামের !শেষে শূন্য নয় তা নিশ্চিত করতে var

ডকুমেন্টেশন থেকে

“একবার আপনি যদি নিশ্চিত হন যে theচ্ছিকর মধ্যে একটি মান রয়েছে তবে আপনি alচ্ছিকের নামের শেষে বিস্মৃত চিহ্ন (!) যুক্ত করে এর অন্তর্নিহিত মানটি অ্যাক্সেস করতে পারবেন। বিস্ময়কর চিহ্নটি কার্যকরভাবে বলেছে, “আমি জানি যে এই alচ্ছিকটির অবশ্যই একটি মূল্য রয়েছে; দয়া করে এটি ব্যবহার করুন। "

নন নিল মানটি পরীক্ষা করার আরেকটি উপায়

    if let j = json {
        // do something with j
    }

1
হ্যাঁ, ডকুমেন্টেশনে আমি এটি দেখেছিলাম, তবে এটি এখনও অপ্রয়োজনীয় বলে মনে হচ্ছে ... যেমনটি আমার john.apartment = number73কাছেও বলেছে "আমি জানি যে এই
ট্রয়

6
হ্যাঁ এটি করে তবে মূল কথাটি হ'ল ডিফল্টরূপে সুইফট সংকলনের সময় ত্রুটিগুলি ধরার চেষ্টা করে। যদি আপনি জানেন বা মনে করেন আপনি জানেন যে এই পরিবর্তনশীলটিতে শূন্য থাকে না আপনি বিস্মৃত চিহ্নটি ব্যবহার করে সেই চেকটি সরাতে পারেন।
লাসসেজ

16

এখানে কিছু উদাহরন:

var name:String = "Hello World"
var word:String?

যেখানে wordএকটি alচ্ছিক মান। এর অর্থ এটিতে কোনও মান থাকতে পারে বা নাও থাকতে পারে।

word = name 

এখানে nameএকটি মান রয়েছে যাতে আমরা এটি নির্ধারণ করতে পারি

var cow:String = nil
var dog:String!

যেখানে dogবলপূর্বকভাবে মোড়ানো হয় না মানে এর অবশ্যই একটি মান থাকতে হবে

dog = cow

অ্যাপ্লিকেশনটি ক্র্যাশ হবে কারণ আমরা nilমোড়কে মোড়কে অর্পণ করেছি


1
var c:Int = nilপাবেন: "নিল নির্দিষ্ট ধরণের '
ইন্ট

15

এক্ষেত্রে...

ভার জন: ব্যক্তি!

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


1
ধন্যবাদ. আমি নিম্নলিখিত লিঙ্কটি পেয়েছি যা এটি ব্যাখ্যা করে explains এই ধরণের ধরণটিকে "অন্তর্নির্মিতভাবে আবদ্ধ বিকল্প" বলা হয়। stackoverflow.com/questions/24122601/...
Kaydell

5

আপনি যদি কোনও সি-পারিবারিক ভাষা থেকে এসে থাকেন তবে আপনি "টাইপ এক্স এর পয়েন্টারটি যা মেমরি অ্যাড্রেস 0 (NULL) হতে পারে" ভাবছেন এবং আপনি যদি গতিশীল টাইপ করা ভাষা থেকে এসে থাকেন তবে আপনি হবেন "অবজেক্টটি যা সম্ভবত টাইপ এক্স এর তবে এটি টাইপ অপরিজ্ঞাত হতে পারে" thinking এগুলির কোনওটিই আসলে সঠিক নয়, যদিও চক্রাকার উপায়ে প্রথমটি নিকটে থাকে।

আপনি যেভাবে এটি সম্পর্কে ভাবছেন তা হ'ল এটি একটি বস্তুর মতো:

struct Optional<T> {
   var isNil:Boolean
   var realObject:T
}

যখন আপনি আপনার alচ্ছিক মানটি foo == nilসত্যই ফিরে আসার সাথে পরীক্ষা করছেন foo.isNilএবং যখন আপনি বলেন যে foo!এটি foo.realObjectদৃ it's়তার সাথে ফিরে আসছে foo.isNil == false। এটি লক্ষ করা জরুরী কারণ যদি fooআপনি এটি করার সময় যদি শূন্য থাকে তবে foo!এটি একটি রানটাইম ত্রুটি, সুতরাং সাধারণত আপনি শর্তসাপেক্ষে লেট ব্যবহার করতে চান যদি না আপনি নিশ্চিত হন যে মানটি শূন্য হবে না। এই ধরণের কৌতূহলের অর্থ এই যে ভাষাটি পরীক্ষা করতে আপনাকে বাধ্য না করে জোরালোভাবে টাইপ করা যেতে পারে যদি মান সর্বত্রই শূন্য থাকে।

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

অন্য পরিস্থিতিতে আপনি যেভাবে বিস্ময়কর চিহ্নটি দেখতে চান তা কোনও ধরণের উপরে রয়েছে:

func foo(bar: String!) {
    print(bar)
}

এটি বাধ্যতামূলক আন-মোড়ক দিয়ে withচ্ছিক গ্রহণের সমান, যেমন:

func foo(bar: String?) {
    print(bar!)
}

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


3

দ্য ! এর অর্থ হল আপনি জোর করে বস্তুটিকে আন-র্যাপ করে দিচ্ছেন! অনুসরণ করে। অ্যাপল ডকুমেন্টেশনে আরও তথ্য পাওয়া যাবে, যা এখানে পাওয়া যাবে: https://developer.apple.com/library/ios/docamentation/swift/conceptual/Swift_Programming_Language/TheBasics.html


3

আপনি যদি সি # এর সাথে পরিচিত হন তবে এটি নলযোগ্য প্রকারের মতো যা একটি প্রশ্ন চিহ্ন ব্যবহার করে ঘোষণাও করা হয়:

Person? thisPerson;

এবং এই ক্ষেত্রে বিস্ময়বোধক চিহ্নটি হ'ল নালামের ধরণের সম্পত্তি মূল্য হিসাবে অ্যাক্সেস করার সমান:

thisPerson.Value

2

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

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

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

var hw = "Hello World"

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

//This is an error

if hw

 {..}

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

var nhw : String? = "Hello World"

//This is correct

if nhw

 {..}

2

দ্য ! একটি অবজেক্টের শেষে বলে যে অবজেক্টটি একটি alচ্ছিক এবং যদি তা অন্যথায় শূন্য করতে পারে তবে আনপাট করা। এটি প্রায়শই ত্রুটিগুলি ফাঁদে ফেলতে ব্যবহৃত হয় যা অন্যথায় প্রোগ্রামটি ক্রাশ করে।


2

সংক্ষেপে (!): আপনি কোনও ভেরিয়েবল ঘোষণা করার পরে এবং আপনি নিশ্চিত হন যে ভেরিয়েবলটির একটি মান রয়েছে।

let assumedString: String! = "Some message..."
let implicitString: String = assumedString

অন্যথায় আপনাকে প্রতিটি পাস করার পরে মানটি পাস করতে হবে ...

let possibleString: String? = "An optional string."
let forcedString: String = possibleString! // requires an exclamation mark

1

জন হ'ল একটি alচ্ছিক ব্যক্তি, যার অর্থ এটি কোনও মূল্য ধরে রাখতে পারে বা শূন্য করতে পারে।

john.apartment = number73

জন একটি alচ্ছিক না হলে ব্যবহৃত হয়। যেহেতু জন কখনই শূন্য হয় না আমরা নিশ্চিত হতে পারি যে এটি অ্যাপার্টমেন্টকে কোনও শূন্যমূল্যে কল করবে না। যদিও

john!.apartment = number73

সংকলককে প্রতিশ্রুতি দেয় যে জন শূন্য নয়, তারপরে জন এর মান পেতে alচ্ছিক আনপ্যাপ করে এবং জনের অ্যাপার্টমেন্ট সম্পত্তি অ্যাক্সেস করে। আপনি যদি জানেন যে জন নিল না this যদি আপনি এইটিকে শূন্য optionচ্ছিকভাবে কল করেন তবে আপনি রানটাইম ত্রুটি পাবেন।

ডকুমেন্টেশনে এটি ব্যবহারের জন্য একটি দুর্দান্ত উদাহরণ রয়েছে যেখানে রূপান্তরিত নম্বরটি একটি alচ্ছিক।

if convertedNumber {
    println("\(possibleNumber) has an integer value of \(convertedNumber!)")
} else {
    println("\(possibleNumber) could not be converted to an integer")
}

আপনি কি বলছেন যে জন যদি শূন্য হয়, এবং আমি যাই john.apartment = number73, যে আমি একটি 'না রাখিলে ত্রুটি ঘটবে না!' জন পরে?
ট্রয়

জন যদি alচ্ছিক হয় তবে আপনাকে অবশ্যই এর বৈশিষ্ট্যগুলি অ্যাক্সেস করার জন্য বিস্ময়বোধক পয়েন্টটি ব্যবহার করতে হবে কারণ সংকলকটি অবশ্যই জানতে হবে যে এটি শূন্য নয়। যদি এটি alচ্ছিক না হয় আপনি বিস্ময়বোধক পয়েন্টটি ব্যবহার করতে পারবেন না।
কনার

1
যদি আমি অবশ্যই সমস্ত alচ্ছিক যুদ্ধের জন্য একটি বিস্ময়বোধক পয়েন্ট ব্যবহার করতে পারি, তবে কেন অ্যাপল এটিকে তৈরি করার বিপরীতে কেন বিরক্তি প্রকাশ করেছিল তাই কোনও বিস্মৃত বিবরণের অভাব একই অর্থ? এটি অকারণে ফুলে যাবার মতো মনে হচ্ছে ... বা এমন কোনও ঘটনা রয়েছে যেখানে whereচ্ছিক বর্ণ সহ বিস্মৃতিবোধক বিন্দুটি ব্যবহার না করা এটি বোধ করে?
ট্রয়

আপনি যখন উদ্বিগ্ন বিন্দুটি অপ্রয়োজনীয় প্রয়োজন প্রয়োজন তখন আপনি বিস্ময়বোধক পয়েন্টটি ব্যবহার করেন। জন বৈশিষ্ট্য অ্যাক্সেস সঙ্গে ক্ষেত্রে যেমন। আপনি ভ্যার জ্যাকের মতো কিছু করতে পারেন: ব্যক্তি? = জন যেখানে জ্যাকটি একটি alচ্ছিক বা ভ্যার জ্যাক: ব্যক্তি = জন! যেখানে জ্যাক একজন ব্যক্তি এবং শূন্য নয়
কনার

ঠিক আছে, তবে, উদাহরণস্বরূপ, আমি যে theচ্ছিককে fereচ্ছিকভাবে বিবেচনা করছি johnতা কি কম্পাইলারকে বলে না যে এটি আমার নন-শূন্য হওয়া দরকার? ... এবং আপনার var jack: Person = john!উদাহরণে, কোনও অভাব নেই? ব্যক্তি সংকলককে বলার পরে আপনাকে johnনন-শিল করা দরকার? সামগ্রিকভাবে, দেখে !মনে হচ্ছে একরকম অপ্রয়োজনীয় ... এটি এখনও মনে হচ্ছে যে "কেন" অংশে আমি কিছু মিস করছি !...
ট্রয়

1

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

var optionalExample: String?

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

আশা করি যে সাহায্য করেছে।


1

সহজ শব্দে

বিস্ময়কর চিহ্নটি ব্যবহার করে ইঙ্গিত দেয় যে ভেরিয়েবলটিতে অবশ্যই শূন্যের মান থাকে (এটি কখনই শূন্য হয় না)


1

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

এখন এমন সময় এসেছে যখন আপনি জানেন যে এই জাতীয় ?চ্ছিক ভেরিয়েবলগুলি উদাহরণস্বরূপ বা আপনার নিজস্ব প্রোগ্রাম হিসাবে সিস্টেমের দ্বারা নির্ধারিত মানগুলি অর্পণ করা হবে তবে কিছু পরে, উদাহরণস্বরূপ ইউআই আউটলেটগুলি, এমন পরিস্থিতিতে প্রশ্ন চিহ্ন ব্যবহার করে usingচ্ছিক পরিবর্তনশীল ঘোষণার পরিবর্তে "?" আমরা ব্যাবহার করি "!".

সুতরাং সিস্টেম জানে যে এই পরিবর্তনশীলটি "দিয়ে ঘোষণা করা হয়!" এখনই isচ্ছিক এবং এর কোনও মূল্য নেই তবে তার জীবদ্দশায় পরবর্তী সময়ে এটি একটি মান পাবে।

সুতরাং বিস্ময়বোধক চিহ্নটি দুটি পৃথক ব্যবহার করে, ১. একটি ভেরিয়েবল ঘোষণা করা যা alচ্ছিক হবে এবং এটি পরে অবশ্যই মান পাবে 2. anচ্ছিক ভেরিয়েবলটিকে অভিব্যক্তিতে ব্যবহারের আগে আন-.াকানো।

উপরে বর্ণিত বিবরণগুলি খুব বেশি প্রযুক্তিগত জিনিস এড়িয়ে চলে, আমি আশা করি।


1

আপনি যদি এটি alচ্ছিক হিসাবে ব্যবহার করেন তবে এটি alচ্ছিকটিকে আবরণে দেখায় এবং কিছু আছে কিনা তা দেখে। আপনি যদি এটি ব্যবহার করেন তবে-অন্য বিবৃতিটি নোটের জন্য কোড। উদাহরণ স্বরূপ,

if (myNumber != 3){
 // if myNumber is NOT 3 do whatever is inside these brackets.
)

1

.চ্ছিক ভেরিয়েবলের মান থাকতে পারে বা নাও থাকতে পারে

মামলা 1: var myVar:String? = "Something"

কেস 2: var myVar:String? = nil

এখন আপনি যদি মাইওয়ারকে জিজ্ঞাসা করেন! "Something"

ক্ষেত্রে 2 এটি ক্রাশ হবে।

মানে! চিহ্ন সংকলককে কোনও মান ফেরত দিতে বাধ্য করবে, এমনকি যদি এটি না থাকে। কেন নাম জোর করে মোড়ানো


@Moritz। আমি জানি না এটা কি? ইতিমধ্যে যদি কোনও প্রশ্নের উত্তর দেওয়া হয় তবে আমি উত্তর দিতে পারি? আমি কি কোনও সমস্যা সৃষ্টি করছি বা আমার উত্তরে কিছু ভুল আছে? আমি বুঝতে পারি না কেন আপনি সঠিকভাবে উত্তর দেওয়ার জন্য এটিকে নিম্নচাপ দিচ্ছেন? আমি ধারণাটি সম্পর্কে আমার বোঝার ভিত্তিতে উত্তর দেওয়ার চেষ্টা করেছি। আমি মনে করি কিছু লোক পরিষ্কার এবং সহজে ব্যাখ্যা করার জন্য এটি সহায়ক বলে মনে করবে।
আশীষ পাইসে

@ মরিজ এখন এই গঠনমূলক। আপনি যদি এই কারণটি হতেন তবে প্রথমে আমাকে এই সংশোধনটি বলা উচিত ছিল। সাহায্য করার জন্য ধন্যবাদ. আমি এটা সংশোধন করেছি।
আশীষ পিসে

0
Simple the Optional variable allows nil to be stored.

var str : String? = nil

str = "Data"

To convert Optional to the Specific DataType, We unwrap the variable using the keyword "!"

func get(message : String){
   return
}

get(message : str!)  // Unwapped to pass as String

1
দয়া করে এমন উত্তর লিখবেন না যা পূর্ববর্তী উত্তরগুলির দ্বারা ইতিমধ্যে আবৃত হয়নি এমন কিছু যুক্ত করছে না।
ডালিজা প্রসন্নিকর

-1

নিজেকে জিজ্ঞাসা করুন

  • এই ধরণের person?কি কোনও apartmentসদস্য / সম্পত্তি আছে? অথবা
  • এই ধরণের personকি কোনও apartmentসদস্য / সম্পত্তি আছে?

আপনি যদি এই প্রশ্নের উত্তর দিতে না পারেন, তবে পড়া চালিয়ে যান:

বুঝতে আপনার জেনারিক্সের বোঝার উচ্চ-বেসিক স্তরের প্রয়োজন হতে পারে । এখানে দেখুন । জেনারিক্স ব্যবহার করে সুইফটে অনেক কিছুই লেখা হয়। বিকল্প অন্তর্ভুক্ত

নীচের কোডটি এই স্ট্যানফোর্ড ভিডিও থেকে উপলব্ধ করা হয়েছে । আপনি প্রথম 5 মিনিট দেখার জন্য উচ্চ সুপারিশ

একটি ptionচ্ছিক একটি এনাম যা কেবল 2 টি ক্ষেত্রে রয়েছে

enum Optional<T>{
    case None
    case Some(T)
}

let x: String? = nil //actually means:

let x = Optional<String>.None

let x :String? = "hello" //actually means:

let x = Optional<String>.Some("hello")

var y = x! // actually means:

switch x {
case .Some(let value): y = value
case .None: // Raise an exception
}

Ptionচ্ছিক বাঁধাই:

let x:String? = something
if let y = x {
    // do something with y
}
//Actually means:

switch x{
case .Some(let y): print)(y) // or whatever else you like using 
case .None: break
}

যখন আপনি বলেন var john: Person?আপনি আসলে এরকমই বোঝেন:

enum Optional<Person>{
case .None
case .Some(Person)
}

উপরের এনামের কি কোনও সম্পত্তির নাম আছে apartment? আপনি এটি কোথাও দেখতে পাচ্ছেন? এটা মোটেই নেই! তবে আপনি যদি এটি মোড়ক না রেখে ie করেন person!তবে আপনি করতে পারবেন ... এটি হুডের নীচে যা করে তা হ'ল:Optional<Person>.Some(Person(name: "John Appleseed"))


আপনি যদি এর var john: Personপরিবর্তে সংজ্ঞায়িত হন: var john: Person?তবে আপনার আর ব্যবহারের দরকার !পড়েনি, কারণ Personনিজেই এর সদস্যapartment


ভবিষ্যতে আলোচনা হিসাবে কেন !মোড়ক ব্যবহার করা কখনও কখনও এই প্রশ্নোত্তর দেখার পরামর্শ দেওয়া হয় না


2
উপরের প্রকৃত স্লাইডগুলি ব্যবহার করা সম্ভবত কপিরাইট লঙ্ঘন: "... স্ট্যানফোর্ড বিশ্ববিদ্যালয় আমাদের আইটিউনস ইউ সংগ্রহের সমস্ত সামগ্রীর কপিরাইট বজায় রাখে" " , http://itunes.stanford.edu থেকে । সম্ভবত আপনার নিজের কথায় উত্তর দেওয়ার চেয়ে ভাল উত্তর দেওয়া উচিত, আপনি অবশ্যই এই প্রশ্নের উত্তরটি বুঝতে পেরেছেন এমন কোর্সটি থেকে (এবং স্লাইডগুলি ব্যবহার না করে বরং সেগুলির প্রাসঙ্গিক অংশগুলি কোড আকারে, রেফারেন্স সহ, প্রাকৃতিকভাবে) উদ্ধৃত করবেন।
dfri

2
আপনার যুক্তিটি হল পপুলমের যুক্তি । যাইহোক, আমি বিশ্বাস করি না যে স্ট্যানফোর্ড এখানে এসে ডিএমসিএ অধিকার প্রয়োগ করবে , তবে আপনার উত্তরগুলি সরকারী / বৈধ উত্সগুলির উপর ভিত্তি করে আপনার নিজস্ব কথায় থাকে এবং এই উত্সগুলি উপরের মতো অনুলিপি করার আকারে নয়; বিশেষত যখন আমরা কপিরাইটযুক্ত স্লাইডগুলি নিয়ে কথা বলি: আবার, কোড ব্লকগুলিতে স্লাইডগুলির বিষয়বস্তু উদ্ধৃত করা ভাল (কোডের চিত্রগুলি এখানে সাধারণত একটি নো!) হয়।
dfri

1
আমি যে মেটা পোস্টটির সাথে লিঙ্ক করেছি কেবলমাত্র এটির জন্য SO: এর পদ্ধতির বর্ণনা দিয়েছি: কিছু এলোমেলো ব্যবহারকারী যদি এটি কপিরাইট লঙ্ঘন হিসাবে রিপোর্ট করে তবে স্বাভাবিকভাবেই এই পোস্টটি সরানো হবে না: কেবলমাত্র যদি স্ট্যানফোর্ডের প্রতিনিধি। এখানে আসার কথা ছিল এবং পোস্টটি সরিয়ে দেওয়ার সাথে সাথে এটি কার্যকর করতে হবে। তাই আমি লিখেছিলাম " আমি বিশ্বাস করি না স্ট্যানফোর্ড এখানে এসে ডিএমসিএ অধিকার প্রয়োগ করবে, ..." । উপরের আমার বক্তব্যটি হ'ল আমি বিশ্বাস করি এটি সম্ভবত কপিরাইট লঙ্ঘন (যা আমি ভুল বলে বিশ্বাস করি) তবে স্বাভাবিকভাবেই কেউ এটিকে প্রয়োগ করবে না। ...
dfri

1
তবে এটিকে বাদ দিয়ে, এমন প্রশ্ন বা উত্তর পোস্ট করা যাতে কোডের চিত্র রয়েছে, বেশ কয়েকটি কারণে খাড়াভাবে নিরুৎসাহিত হয় । এটিকে মোড়ানোর জন্য: আমি এই মন্তব্যগুলির সাথে উল্লেখ করার চেষ্টা করেছি যে আমি দুটি উত্তরের কারণে (কপিরাইটযুক্ত স্লাইডস, কোডের চিত্র) এর উত্তরটিকে বর্তমান রূপে বিশ্বাস করি যে এটি পুরোপুরি ঠিক ততটা ভাল নয়। স্বাভাবিকভাবেই আমার সহ কেউই এ সম্পর্কে কিছু করবে না, আমি এটিকে ভবিষ্যতের রেফারেন্সের জন্য কেবল আমাদের নির্দেশ করছি (বা সম্ভবত কোডটি ব্লকের মাধ্যমে এই পোস্টটি সম্পাদনা করার জন্য আপনাকে উত্সাহিত করছি)। সম্মত, আইটিউনস ইউ! :)
ডিফ্রি

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