ऐसा एक उपयोग है जिसके बारे में मैं सोच सकता हूं, और यह कुछ ऐसा है जिसे स्विफ्ट प्रोग्रामिंग भाषा में सुधार के रूप में माना गया है।
स्विफ्ट में एक maybeमोनाड है, वर्तनी है Optional<T>या T?। इसके साथ बातचीत करने के कई तरीके हैं।
आप जैसे सशर्त अलौकिक का उपयोग कर सकते हैं
if let nonOptional = someOptional {
print(nonOptional)
}
else {
print("someOptional was nil")
}
आप उपयोग कर सकते हैं map, flatMapमूल्यों को बदलने के लिए
- बल पूर्ववत संचालक (
!प्रकार का (T?) -> T) सामग्री को जबरन खोलना, अन्यथा किसी दुर्घटना को ट्रिगर करना
अपना मान लेने के लिए या अन्यथा डिफ़ॉल्ट मान का उपयोग करने के लिए nil-coalescing ऑपरेटर ( ??प्रकार का (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()))?