আমি ভাবতে পারি এমন একটি ব্যবহার রয়েছে এবং এটি এমন একটি বিষয় যা সুইফ্ট প্রোগ্রামিং ভাষার উন্নতি হিসাবে বিবেচিত হয়েছে।
সুইফ্টের একটি maybe
মোনাড, বানান Optional<T>
বা T?
। এটির সাথে ইন্টারঅ্যাক্ট করার অনেকগুলি উপায় রয়েছে।
আপনি শর্তসাপেক্ষ আনআরপিংয়ের মতো ব্যবহার করতে পারেন
if let nonOptional = someOptional {
print(nonOptional)
}
else {
print("someOptional was nil")
}
আপনি ব্যবহার করতে পারেন map
, flatMap
মান রুপান্তর
- বাধ্যতামূলকভাবে বিষয়বস্তু মোড়ক মোছার জন্য অপারেটর (
!
, প্রকারের (T?) -> T
) জোর করে মোছা, অন্যথায় ক্রাশটি ট্রিগার করে
নীল-কোয়েলসিং অপারেটর ( ??
, প্রকারের (T?, T) -> T
) এর মান নিতে বা অন্যথায় একটি ডিফল্ট মান ব্যবহার করতে:
let someI = Optional(100)
print(someI ?? 123) => 100 // "left operand is non-nil, unwrap it.
let noneI: Int? = nil
print(noneI ?? 123) // => 123 // left operand is nil, take right operand, acts like a "default" value
দুর্ভাগ্যক্রমে, "মোড়ানো বা একটি ত্রুটি নিক্ষেপ" বা "কাস্টম ত্রুটি বার্তার সাথে মোড়ক বা ক্রাশ" বলার কোনও সংক্ষিপ্ত উপায় ছিল না। কিছুটা এইরকম
let someI: Int? = Optional(123)
let nonOptionalI: Int = someI ?? fatalError("Expected a non-nil value")
সংকলন করে না, কারণ fatalError
টাইপ আছে () -> Never
( ()
হ'ল Void
সুইফটের ইউনিট টাইপ, Never
সুইফটের নীচের প্রকার)। এটির কলিং এটি উত্পাদন করে Never
, যা T
ডান সংক্ষেপণের হিসাবে প্রত্যাশার সাথে উপযুক্ত নয় ??
।
এটিরSE-0217
প্রতিকারের প্রয়াসে, সুইফ্ট বিবর্তনের প্রস্তাব - " আনপ্রেপ বা ডাই" অপারেটরটি রাখা হয়েছিল। এটি চূড়ান্তভাবে প্রত্যাখ্যান করা হয়েছিল , তবে এটি Never
সমস্ত ধরণের একটি উপপ্রকার হতে আগ্রহী করেছিল ।
যদি Never
সকল ধরণের উপপ্রকার হিসাবে তৈরি করা হয় তবে পূর্ববর্তী উদাহরণটি সংকলনযোগ্য হবে:
let someI: Int? = Optional(123)
let nonOptionalI: Int = someI ?? fatalError("Expected a non-nil value")
কারণ কল সাইটটিতে ??
টাইপ রয়েছে (T?, Never) -> T
যা (T?, T) -> T
স্বাক্ষরের সাথে সামঞ্জস্যপূর্ণ ??
।
(x ? 3 : throw new Exception())
বিশ্লেষণের উদ্দেশ্যে এমন কিছুর মতো আরও কিছু দিয়ে প্রতিস্থাপন করা হয়(x ? 3 : absurd(throw new Exception()))
?