Swift Language
optionals
खोज…
परिचय
"एक वैकल्पिक मूल्य में या तो एक मान होता है या इसमें यह इंगित करने के लिए शून्य होता है कि मान गायब है"
इसके अंश: Apple Inc. "स्विफ्ट प्रोग्रामिंग लैंग्वेज (स्विफ्ट 3.1 संस्करण)।" iBooks। https://itun.es/us/k5SW7.l
बुनियादी वैकल्पिक उपयोग के मामलों में शामिल हैं: एक निरंतर (चलो) के लिए, एक लूप के भीतर एक वैकल्पिक का उपयोग (यदि-चलो), सुरक्षित रूप से एक विधि (गार्ड-लेट) के भीतर एक वैकल्पिक मूल्य को उजागर करना, और स्विच लूप (केस-लेट) के हिस्से के रूप में ), एक मान के लिए डिफ़ॉल्ट अगर nil, coalesce ऑपरेटर का उपयोग कर (??)
वाक्य - विन्यास
- var वैकल्पिक नाम: वैकल्पिक प्रकार? // एक वैकल्पिक प्रकार घोषित करें, शून्य में चूक
- var वैकल्पिक नाम: वैकल्पिक प्रकार? = मान // एक मूल्य के साथ एक वैकल्पिक घोषित करें
- var वैकल्पिक नाम: वैकल्पिक टाइप! // एक अंतर्निहित अलिखित वैकल्पिक घोषित करें
- वैकल्पिक! // बल एक वैकल्पिक खोलना
टिप्पणियों
वैकल्पिक के बारे में अधिक जानकारी के लिए, स्विफ्ट प्रोग्रामिंग भाषा देखें ।
वैकल्पिक के प्रकार
वैकल्पिक एक सामान्य एनुम प्रकार है जो आवरण के रूप में कार्य करता है। यह आवरण एक वैरिएबल को दो में से एक स्थिति की अनुमति देता है: उपयोगकर्ता-परिभाषित प्रकार या nil
का मान, जो मान के अभाव का प्रतिनिधित्व करता है।
स्विफ्ट में यह क्षमता विशेष रूप से महत्वपूर्ण है क्योंकि भाषा के घोषित डिजाइन उद्देश्यों में से एक ऐप्पल के ढांचे के साथ अच्छी तरह से काम करना है। ऐप्पल के ढांचे के कई (अधिकांश) उद्देश्य और सी के भीतर प्रोग्रामिंग पैटर्न और एपीआई डिजाइन के उपयोग में आसानी के कारण nil
का उपयोग करते हैं।
स्विफ्ट में, एक वैरिएबल के लिए nil
मान होना चाहिए, यह एक वैकल्पिक होना चाहिए। या तो जोड़कर वैकल्पिक बनाया जा सकता है !
या ?
चर प्रकार के लिए। उदाहरण के लिए, एक Int
वैकल्पिक बनाने के लिए, आप उपयोग कर सकते हैं
var numberOne: Int! = nil
var numberTwo: Int? = nil
?
वैकल्पिक रूप से स्पष्ट रूप से अपरिवर्तित होना चाहिए, और इसका उपयोग किया जाना चाहिए यदि आप निश्चित नहीं हैं कि जब आप इसे एक्सेस करते हैं तो चर का मान होगा या नहीं। उदाहरण के लिए, जब एक स्ट्रिंग को Int
में बदलते हैं, तो परिणाम एक वैकल्पिक Int?
, क्योंकि अगर स्ट्रिंग एक वैध संख्या नहीं है, तो एनआईएल वापस कर दिया जाएगा
let str1 = "42"
let num1: Int? = Int(str1) // 42
let str2 = "Hello, World!"
let num2: Int? = Int(str2) // nil
!
वैकल्पिक रूप से स्वचालित रूप से अपरिवर्तित होते हैं, और इसका उपयोग केवल तब किया जाना चाहिए जब आप निश्चित हों कि जब आप इसे एक्सेस करते हैं तो चर का मूल्य होगा। उदाहरण के लिए, एक वैश्विक UIButton!
वैरिएबल जिसे viewDidLoad()
में आरंभ किया गया है viewDidLoad()
//myButton will not be accessed until viewDidLoad is called,
//so a ! optional can be used here
var myButton: UIButton!
override func viewDidLoad(){
self.myButton = UIButton(frame: self.view.frame)
self.myButton.backgroundColor = UIColor.redColor()
self.view.addSubview(self.myButton)
}
एक वैकल्पिक खोलना
एक वैकल्पिक के मूल्य का उपयोग करने के लिए, इसे अलिखित करने की आवश्यकता है।
आप सशर्त रूप से वैकल्पिक बाइंडिंग का उपयोग करके एक वैकल्पिक को खोल सकते हैं और एक वैकल्पिक का उपयोग करने के लिए मजबूर कर सकते हैं !
ऑपरेटर।
सशर्त रूप से अपरिवर्तनीय रूप से पूछता है "क्या इस चर का कोई मूल्य है?" जब बल प्रयोग समाप्त होता है, तो कहते हैं, "इस चर का एक मूल्य है!"।
यदि आप एक चर को nil
, जो nil
, तो एक वैकल्पिक अपवाद और दुर्घटना को उजागर करते हुए , अप्रत्याशित रूप से पाए गए शून्य को फेंक देंगे, इसलिए आपको उपयोग करते समय सावधानी से विचार करने की आवश्यकता है !
उचित है।
var text: String? = nil
var unwrapped: String = text! //crashes with "unexpectedly found nil while unwrapping an Optional value"
सुरक्षित अपरिवर्तन के लिए, आप एक if-let
स्टेटमेंट का उपयोग कर सकते हैं, जो लिपटे मान nil
अपवाद या क्रैश नहीं करेगा:
var number: Int?
if let unwrappedNumber = number { // Has `number` been assigned a value?
print("number: \(unwrappedNumber)") // Will not enter this line
} else {
print("number was not assigned a value")
}
या, एक गार्ड बयान :
var number: Int?
guard let unwrappedNumber = number else {
return
}
print("number: \(unwrappedNumber)")
ध्यान दें कि unwrappedNumber
चर का दायरा if-let
स्टेटमेंट के अंदर है और guard
ब्लॉक के बाहर है।
आप कई वैकल्पिकों को अलिखित कर सकते हैं, यह उन मामलों में मुख्य रूप से उपयोगी है जिनके कोड को सही ढंग से चलाने के लिए अधिक चर की आवश्यकता होती है:
var firstName:String?
var lastName:String?
if let fn = firstName, let ln = lastName {
print("\(fn) + \(ln)")//pay attention that the condition will be true only if both optionals are not nil.
}
ध्यान दें कि परीक्षण को सफलतापूर्वक पास करने के लिए सभी चर को अलग करना होगा, अन्यथा आपके पास यह निर्धारित करने का कोई तरीका नहीं होगा कि कौन से चर को हटा दिया गया था और जो नहीं थे।
आप इसे अलिखित होने के तुरंत बाद अपने वैकल्पिक का उपयोग करके सशर्त बयानों को चेन कर सकते हैं। इसका मतलब यह है कि कोई नेस्टेड नहीं है - और बयान!
var firstName:String? = "Bob"
var myBool:Bool? = false
if let fn = firstName, fn == "Bob", let bool = myBool, !bool {
print("firstName is bob and myBool was false!")
}
निल कॉलेशिंग ऑपरेटर
यदि आप गैर-शून्य हैं, तो मान को अनप्लग करने के लिए आप nil coalescing संचालक का उपयोग कर सकते हैं, अन्यथा एक अलग मूल्य प्रदान करें:
func fallbackIfNil(str: String?) -> String {
return str ?? "Fallback String"
}
print(fallbackIfNil("Hi")) // Prints "Hi"
print(fallbackIfNil(nil)) // Prints "Fallback String"
यह ऑपरेटर शॉर्ट-सर्किट करने में सक्षम है, जिसका अर्थ है कि यदि बाएं ऑपरेंड गैर-शून्य है, तो सही ऑपरेटर का मूल्यांकन नहीं किया जाएगा:
func someExpensiveComputation() -> String { ... }
var foo : String? = "a string"
let str = foo ?? someExpensiveComputation()
इस उदाहरण में, जैसा कि foo
गैर-शून्य है, कुछ someExpensiveComputation()
नहीं कहा जाएगा।
आप एक साथ कई निल्स सहवर्ती बयानों की श्रृंखला भी बना सकते हैं:
var foo : String?
var bar : String?
let baz = foo ?? bar ?? "fallback string"
इस उदाहरण में baz
को गैर-शून्य होने पर foo
के अलिखित मूल्य को सौंपा जाएगा, अन्यथा यह गैर-शून्य होने पर bar
के अलिखित मूल्य को सौंपा जाएगा, अन्यथा इसे फॉलबैक मूल्य सौंपा जाएगा।
वैकल्पिक चेनिंग
आप एक विधि को कॉल करने के लिए, वैकल्पिक कॉलिंग का उपयोग कर सकते हैं, एक संपत्ति का उपयोग कर सकते हैं या एक वैकल्पिक सबस्क्रिप्ट कर सकते हैं। यह एक रखकर किया जाता है ?
दिए गए वैकल्पिक चर और दिए गए सदस्य (विधि, संपत्ति या उपस्क्रिप्ट) के बीच।
struct Foo {
func doSomething() {
print("Hello World!")
}
}
var foo : Foo? = Foo()
foo?.doSomething() // prints "Hello World!" as foo is non-nil
यदि foo
में मान है, तो doSomething()
उस पर कॉल किया जाएगा। यदि foo
nil
, तो कुछ भी बुरा नहीं होगा - कोड बस चुपचाप विफल हो जाएगा और निष्पादित करना जारी रखेगा।
var foo : Foo? = nil
foo?.doSomething() // will not be called as foo is nil
(यह उद्देश्य-सी में nil
संदेश भेजने के लिए समान व्यवहार है)
वैकल्पिक चाइनिंग को इस तरह नाम दिया गया है क्योंकि 'वैकल्पिकता' को आपके द्वारा कॉल / एक्सेस करने वाले सदस्यों के माध्यम से प्रचारित किया जाएगा। इसका मतलब यह है कि वैकल्पिक चैनिंग के साथ उपयोग किए जाने वाले किसी भी सदस्य का रिटर्न मान वैकल्पिक होगा, भले ही वे वैकल्पिक के रूप में टाइप किए गए हों या नहीं।
struct Foo {
var bar : Int
func doSomething() { ... }
}
let foo : Foo? = Foo(bar: 5)
print(foo?.bar) // Optional(5)
यहाँ foo?.bar
Int?
भले ही bar
गैर वैकल्पिक है, के रूप में foo
ही वैकल्पिक है।
जैसा कि वैकल्पिकता का प्रचार किया जाता है, Void
को वापस लाने के तरीके Void
वापस आएंगे Void?
जब वैकल्पिक चैनिंग के साथ कहा जाता है। यह निर्धारित करने के लिए उपयोगी हो सकता है कि विधि को बुलाया गया था या नहीं (और इसलिए यदि वैकल्पिक का कोई मूल्य है)।
let foo : Foo? = Foo()
if foo?.doSomething() != nil {
print("foo is non-nil, and doSomething() was called")
} else {
print("foo is nil, therefore doSomething() wasn't called")
}
यहाँ हम Void?
तुलना कर रहे हैं Void?
यह निर्धारित करने के लिए कि क्या विधि को बुलाया गया था (और इसलिए foo
गैर-शून्य है) के क्रम में nil
साथ रिटर्न वैल्यू।
अवलोकन - वैकल्पिक क्यों?
अक्सर जब प्रोग्रामिंग करते हैं तो एक चर के बीच कुछ अंतर करना आवश्यक होता है जिसमें एक मूल्य होता है और एक ऐसा नहीं होता है। संदर्भ प्रकारों के लिए, जैसे कि सी पॉइंटर्स, एक विशेष मान जैसे null
का उपयोग यह दर्शाने के लिए किया जा सकता है कि चर का कोई मूल्य नहीं है। आंतरिक प्रकारों के लिए, जैसे पूर्णांक, यह अधिक कठिन है। एक नामित मूल्य, जैसे -1 का उपयोग किया जा सकता है, लेकिन यह मूल्य की व्याख्या पर निर्भर करता है। यह सामान्य उपयोग से उस "विशेष" मूल्य को भी समाप्त करता है।
इसे संबोधित करने के लिए, स्विफ्ट किसी भी चर को वैकल्पिक के रूप में घोषित करने की अनुमति देता है। यह एक के उपयोग द्वारा इंगित किया गया है? या! प्रकार के बाद ( वैकल्पिक के प्रकार देखें)
उदाहरण के लिए,
var possiblyInt: Int?
एक वैरिएबल घोषित करता है जिसमें पूर्णांक मान हो या न हो।
विशेष मूल्य nil
इंगित करता है कि वर्तमान में इस चर को कोई मूल्य नहीं दिया गया है।
possiblyInt = 5 // PossiblyInt is now 5
possiblyInt = nil // PossiblyInt is now unassigned
नियत मान के लिए परीक्षण करने के लिए भी nil
उपयोग किया जा सकता है:
if possiblyInt != nil {
print("possiblyInt has the value \(possiblyInt!)")
}
के उपयोग पर ध्यान दें !
वैकल्पिक मूल्य को खोलना प्रिंट स्टेटमेंट में।
वैकल्पिक के सामान्य उपयोग के एक उदाहरण के रूप में, एक फ़ंक्शन पर विचार करें जो एक स्ट्रिंग से एक पूर्णांक देता है जिसमें अंक होते हैं; यह संभव है कि स्ट्रिंग में गैर-अंक वर्ण हो सकते हैं, या यहां तक कि खाली भी हो सकते हैं।
एक फ़ंक्शन जो एक साधारण Int
लौटाता है वह विफलता कैसे इंगित कर सकता है? यह कोई विशिष्ट मूल्य वापस करके ऐसा नहीं कर सकता क्योंकि यह उस मूल्य को स्ट्रिंग से पार्स होने से रोक देगा।
var someInt
someInt = parseInt("not an integer") // How would this function indicate failure?
स्विफ्ट में, हालांकि, वह फ़ंक्शन केवल एक वैकल्पिक इंट वापस कर सकता है। फिर विफलता nil
रिटर्न वैल्यू द्वारा इंगित की जाती है।
var someInt?
someInt = parseInt("not an integer") // This function returns nil if parsing fails
if someInt == nil {
print("That isn't a valid integer")
}