स्विफ्ट - वैकल्पिक चेनिंग

वैकल्पिक, 'nil' हो सकने वाली संपत्तियों, सदस्यता, विधियों को क्वेरी करने, कॉल करने की प्रक्रिया को वैकल्पिक रूप से परिभाषित किया जाता है। वैकल्पिक चैनिंग दो मान लौटाते हैं -

  • यदि वैकल्पिक में 'मान' है, तो संबंधित संपत्ति, विधियों और सदस्यता को रिटर्न मान कहते हैं

  • यदि वैकल्पिक में 'एनआईएल' मूल्य शामिल है, तो इसकी सभी संबंधित संपत्ति, तरीके और सदस्यताएं शून्य हो जाती हैं

चूंकि विधियों, गुणों और सदस्यता के कई प्रश्नों को एक श्रृंखला में विफलता के साथ समूहीकृत किया जाता है, इसलिए यह पूरी श्रृंखला और परिणामों को 'शून्य' मान पर प्रभावित करेगा।

वैकल्पिक चेनिंग को एक विकल्प के रूप में मजबूर करना

वैकल्पिक मान के साथ वैकल्पिक मूल्य निर्धारण निर्दिष्ट है? ' जब कोई मूल्य कुछ मान लौटाता है, तो किसी प्रॉपर्टी, मेथड या सबस्क्रिप्ट को कॉल करने के लिए।

वैकल्पिक चेनिंग '' विधियों, गुणों और सदस्यता तक पहुँच मजबूर करने के लिए
? प्रॉपर्टी, मेथड या सबस्क्रिप्ट को कॉल करने के लिए वैकल्पिक मूल्य के बाद रखा गया है ! गुण, विधि या सबस्क्रिप्ट को कॉल करने के लिए वैकल्पिक मान के बाद रखा जाता है, ताकि मूल्य को उजागर न किया जा सके
वैकल्पिक रूप से वैकल्पिक 'शून्य' होने पर विफल हो जाता है जब वैकल्पिक 'शून्य' हो तो जबरन अपरिपक्व रन टाइम एरर को ट्रिगर करता है

'के साथ वैकल्पिक चेनिंग के लिए कार्यक्रम!'

class ElectionPoll {
   var candidate: Pollbooth?
}

lass Pollbooth {
   var name = "MP"
}

let cand = ElectionPoll()
let candname = cand.candidate!.name

जब हम खेल के मैदान का उपयोग करके उपरोक्त कार्यक्रम चलाते हैं, तो हमें निम्नलिखित परिणाम मिलते हैं -

fatal error: unexpectedly found nil while unwrapping an Optional value
0 Swift 4 0x0000000103410b68
llvm::sys::PrintStackTrace(__sFILE*) + 40
1 Swift 4 0x0000000103411054 SignalHandler(int) + 452
2 libsystem_platform.dylib 0x00007fff9176af1a _sigtramp + 26
3 libsystem_platform.dylib 0x000000000000000b _sigtramp + 1854492939
4 libsystem_platform.dylib 0x00000001074a0214 _sigtramp + 1976783636
5 Swift 4 0x0000000102a85c39
llvm::JIT::runFunction(llvm::Function*, std::__1::vector > const&) + 329
6 Swift 4 0x0000000102d320b3
llvm::ExecutionEngine::runFunctionAsMain(llvm::Function*,
std::__1::vector<std::__1::basic_string, std::__1::allocator >,
std::__1::allocator<std::__1::basic_string, std::__1::allocator > > > const&,
char const* const*) + 1523
7 Swift 4 0x000000010296e6ba Swift 4::RunImmediately(Swift
4::CompilerInstance&, std::__1::vector<std::__1::basic_string,
std::__1::allocator >, std::__1::allocator<std::__1::basic_string,
std::__1::allocator > > > const&, Swift 4::IRGenOptions&, Swift 4::SILOptions
const&) + 1066
8 Swift 4 0x000000010275764b frontend_main(llvm::ArrayRef,
char const*, void*) + 5275
9 Swift 4 0x0000000102754a6d main + 1677
10 libdyld.dylib 0x00007fff8bb9e5c9 start + 1
11 libdyld.dylib 0x000000000000000c start + 1950751300
Stack dump:
0. Program arguments:
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/
usr/bin/Swift 4 -frontend -interpret - -target x86_64-apple-darwin14.0.0 -
target-cpu core2 -sdk
/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/
SDKs/MacOSX10.10.sdk -module-name main
/bin/sh: line 47: 15672 Done cat <<'SWIFT 4'
import Foundation
</std::__1::basic_string</std::__1::basic_string</std::__1::basic_string</std::
__1::basic_string

उपरोक्त कार्यक्रम 'चुनावी सर्वेक्षण' को वर्ग के नाम के रूप में घोषित करता है और इसमें 'उम्मीदवार' को सदस्यता समारोह के रूप में शामिल किया जाता है। उपवर्ग को booth पोल बूथ ’और as नाम’ के रूप में घोषित किया गया है, जिसका सदस्यता समारोह 'एमपी ’के रूप में आरम्भ किया गया है। सुपर क्लास के लिए कॉल को 'वैकल्पिक' के साथ एक उदाहरण 'मोमबत्ती' बनाकर आरम्भ किया जाता है। चूंकि मानों को इसके आधार वर्ग में घोषित नहीं किया गया है, इसलिए 'एनआईएल' मूल्य संग्रहीत किया जाता है, जिससे बल अलिखित प्रक्रिया द्वारा एक घातक त्रुटि वापस आ जाती है।

वैकल्पिक चैनिंग के लिए कार्यक्रम '?'

class ElectionPoll {
   var candidate: Pollbooth?
}

class Pollbooth {
   var name = "MP"
}
let cand = ElectionPoll()

if let candname = cand.candidate?.name {
   print("Candidate name is \(candname)")
} else {
   print("Candidate name cannot be retreived")
}

जब हम खेल के मैदान का उपयोग करके उपरोक्त कार्यक्रम चलाते हैं, तो हमें निम्नलिखित परिणाम मिलते हैं -

Candidate name cannot be retreived

उपरोक्त कार्यक्रम 'चुनावी सर्वेक्षण' को वर्ग के नाम के रूप में घोषित करता है और इसमें 'उम्मीदवार' को सदस्यता समारोह के रूप में शामिल किया जाता है। उपवर्ग को booth पोल बूथ ’और as नाम’ के रूप में घोषित किया गया है, जिसका सदस्यता समारोह 'एमपी ’के रूप में आरम्भ किया गया है। सुपर क्लास के लिए कॉल को 'वैकल्पिक' के साथ एक मोमबत्ती ''? चूंकि मानों को इसके आधार वर्ग में घोषित नहीं किया गया है, इसलिए 'हैंडलर ब्लॉक' द्वारा 'एनआईएल' मूल्य को कंसोल में संग्रहीत और मुद्रित किया जाता है।

वैकल्पिक चेनिंग और एक्सेसिंग गुणों के लिए मॉडल कक्षाएं परिभाषित करना

स्विफ्ट 4 भाषा भी मॉडल कक्षाओं के रूप में एक से अधिक उपवर्गों की घोषणा करने के लिए वैकल्पिक चेनिंग की अवधारणा प्रदान करती है। यह अवधारणा जटिल मॉडल को परिभाषित करने और गुण, विधियों और उप-संपत्तियों की सदस्यता लेने के लिए बहुत उपयोगी होगी।

class rectangle {
   var print: circle?
}

class circle {
   var area = [radius]()
   var cprint: Int {
      return area.count
   }
   subscript(i: Int) -> radius {
      get {
         return area[i]
      }
      set {
         area[i] = newValue
      }
   }
   func circleprint() {
      print("The number of rooms is \(cprint)")
   }
   var rectarea: circumference?
}

class radius {
   let radiusname: String
   init(radiusname: String) { self.radiusname = radiusname }
}

class circumference {
   var circumName: String?
   var circumNumber: String?
   var street: String?

   func buildingIdentifier() -> String? {
      if circumName != nil {
         return circumName
      } else if circumNumber != nil {
         return circumNumber
      } else {
         return nil
      }
   }
}

let rectname = rectangle()
if let rectarea = rectname.print?.cprint {
   print("Area of rectangle is \(rectarea)")
} else {
   print("Rectangle Area is not specified")
}

जब हम खेल के मैदान का उपयोग करके उपरोक्त कार्यक्रम चलाते हैं, तो हमें निम्नलिखित परिणाम मिलते हैं -

Rectangle Area is not specified

वैकल्पिक चैनिंग के माध्यम से कॉलिंग के तरीके

class rectangle {
   var print: circle?
}

class circle {
   var area = [radius]()
   var cprint: Int {
      return area.count
   }
   subscript(i: Int) -> radius {
      get {
         return area[i]
      }
      set {
         area[i] = newValue
      }
   }

   func circleprint() {
      print("Area of Circle is: \(cprint)")
   }
   var rectarea: circumference?
}

class radius {
   let radiusname: String
   init(radiusname: String) { self.radiusname = radiusname }
}

class circumference {
   var circumName: String?
   var circumNumber: String?
   var circumarea: String?
   
   func buildingIdentifier() -> String? {
      if circumName != nil {
         return circumName
      } else if circumNumber != nil {
         return circumNumber
      } else {
         return nil
      }
   }
}

let circname = rectangle()

if circname.print?.circleprint() != nil {
   print("Area of circle is specified)")
} else {
   print("Area of circle is not specified")
}

जब हम खेल के मैदान का उपयोग करके उपरोक्त कार्यक्रम चलाते हैं, तो हमें निम्नलिखित परिणाम मिलते हैं -

Area of circle is not specified

सर्कल के अंदर घोषित फ़ंक्शन सर्कलप्रिंट () सब क्लास को 'सर्कनामे' नाम से एक इंस्टेंस बनाकर बुलाया जाता है। फ़ंक्शन एक मान लौटाएगा यदि इसमें कुछ मान शामिल है अन्यथा यह कुछ उपयोगकर्ता परिभाषित प्रिंट संदेश को '' अगर circ.print.print?। Circleprint ()! = Nil '' स्टेटमेंट की जाँच करके लौटाएगा।

वैकल्पिक चैनिंग के माध्यम से अभिगम की सदस्यता

वैकल्पिक चैनिंग का उपयोग यह निर्धारित करने के लिए किया जाता है कि एक सबस्क्रिप्ट मान प्राप्त किया जाए और उस सबस्क्रिप्ट को कॉल करने पर मान वापस आए। '?' विशेष सबस्क्रिप्ट पर वैकल्पिक मान तक पहुँचने के लिए सबस्क्रिप्ट ब्रेज़ से पहले रखा जाता है।

कार्यक्रम 1

class rectangle {
   var print: circle?
}

class circle {
   var area = [radius]()
   var cprint: Int {
      return area.count
   }
   subscript(i: Int) -> radius {
      get {
         return area[i]
      }
      set {
         area[i] = newValue
      }
   }
   func circleprint() {
      print("The number of rooms is \(cprint)")
   }
   var rectarea: circumference?
}

class radius {
   let radiusname: String
   init(radiusname: String) { self.radiusname =  radiusname }
}

class circumference {
   var circumName: String?
   var circumNumber: String?
   var circumarea: String?
   
   func buildingIdentifier() -> String? {
      if circumName != nil {
         return circumName
      } else if circumNumber != nil {
         return circumNumber
      } else {
         return nil
      }
   }
}

let circname = rectangle()

if let radiusName = circname.print?[0].radiusname {
   print("The first room name is \(radiusName).")
} else {
   print("Radius is not specified.")
}

जब हम खेल के मैदान का उपयोग करके उपरोक्त कार्यक्रम चलाते हैं, तो हमें निम्नलिखित परिणाम मिलते हैं -

Radius is not specified.

उपरोक्त कार्यक्रम में सदस्यता फ़ंक्शन 'त्रिज्यानाम' के लिए उदाहरण मान निर्दिष्ट नहीं है। इसलिए फ़ंक्शन को प्रोग्राम कॉल केवल अन्य भाग लौटाएगा जबकि मूल्यों को वापस करने के लिए हमें विशेष सदस्यता फ़ंक्शन के लिए मानों को परिभाषित करना होगा।

कार्यक्रम 2

class rectangle {
   var print: circle?
}

class circle {
   var area = [radius]()
   var cprint: Int {
      return area.count
   }
   subscript(i: Int) -> radius {
      get {
         return area[i]
      }
      set {
         area[i] = newValue
      }
   }
   func circleprint() {
      print("The number of rooms is \(cprint)")
   }
   var rectarea: circumference?
}

class radius {
   let radiusname: String
   init(radiusname: String) { self.radiusname = radiusname }
}

class circumference {
   var circumName: String?
   var circumNumber: String?
   var circumarea: String?
   
   func buildingIdentifier() -> String? {
      if circumName != nil {
         return circumName
      } else if circumNumber != nil {
         return circumNumber
      } else {
         return nil
      }
   }
}

let circname = rectangle()
circname.print?[0] = radius(radiusname: "Diameter")
let printing = circle()

printing.area.append(radius(radiusname: "Units"))
printing.area.append(radius(radiusname: "Meter"))
circname.print = printing

if let radiusName = circname.print?[0].radiusname {
   print("Radius is measured in \(radiusName).")
} else {
   print("Radius is not specified.")
}

जब हम खेल के मैदान का उपयोग करके उपरोक्त कार्यक्रम चलाते हैं, तो हमें निम्नलिखित परिणाम मिलते हैं -

Radius is measured in Units.

उपरोक्त कार्यक्रम में, सदस्यता फ़ंक्शन 'त्रिज्यानाम' के लिए उदाहरण मान निर्दिष्ट है। इसलिए फ़ंक्शन को प्रोग्राम कॉल अब मान लौटाएगा।

वैकल्पिक प्रकार के अभिगमन

class rectangle {
   var print: circle?
}

class circle {
   var area = [radius]()
   var cprint: Int {
      return area.count
   }

   subscript(i: Int) -> radius {
      get {
         return area[i]
      }
      set {
         area[i] = newValue
      }
   }
   func circleprint() {
      print("The number of rooms is \(cprint)")
   }
   var rectarea: circumference?
}

class radius {
   let radiusname: String
   init(radiusname: String) { self.radiusname = radiusname }
}

class circumference {
   var circumName: String?
   var circumNumber: String?
   var circumarea: String?
   
   func buildingIdentifier() -> String? {
      if circumName != nil {
         return circumName
      } else if circumNumber != nil {
         return circumNumber
      } else {
         return nil
      }
   }
}

let circname = rectangle()
circname.print?[0] = radius(radiusname: "Diameter")

let printing = circle()
printing.area.append(radius(radiusname: "Units"))
printing.area.append(radius(radiusname: "Meter"))
circname.print = printing

var area = ["Radius": [35, 45, 78, 101], "Circle": [90, 45, 56]]
area["Radius"]?[1] = 78
area["Circle"]?[1]--

print(area["Radius"]?[0])
print(area["Radius"]?[1])
print(area["Radius"]?[2])
print(area["Radius"]?[3])

print(area["Circle"]?[0])
print(area["Circle"]?[1])
print(area["Circle"]?[2])

जब हम खेल के मैदान का उपयोग करके उपरोक्त कार्यक्रम चलाते हैं, तो हमें निम्नलिखित परिणाम मिलते हैं -

Optional(35)
Optional(78)
Optional(78)
Optional(101)
Optional(90)
Optional(44)
Optional(56)

सदस्यता के लिए वैकल्पिक मानों को उनके सबस्क्रिप्ट मानों को संदर्भित करके एक्सेस किया जा सकता है। इसे सबस्क्रिप्ट [0], सबस्क्रिप्ट [1] आदि के रूप में एक्सेस किया जा सकता है। 'त्रिज्या' के लिए डिफ़ॉल्ट सबस्क्रिप्ट मानों को पहले [35, 45, 78, 101] और 'सर्कल' [90, 45, 56]] के रूप में सौंपा गया है। । फिर सबस्क्रिप्ट मानों को रेडियस [0] से 78 और सर्कल [1] से 45 में बदल दिया जाता है।

चेनिंग के कई स्तरों को जोड़ना

मल्टीपल सब क्लासेस को इसके सुपर क्लास के तरीकों, प्रॉपर्टीज और सब्सक्राइबर्स के साथ वैकल्पिक चैनिंग द्वारा भी जोड़ा जा सकता है।

वैकल्पिक के कई जंजीरों को जोड़ा जा सकता है -

यदि पुनर्प्राप्त करने का प्रकार वैकल्पिक नहीं है, तो वैकल्पिक चैनिंग एक वैकल्पिक मान लौटाएगा। उदाहरण के लिए यदि स्ट्रिंग को वैकल्पिक श्रृंखलन के माध्यम से देखा जाए तो यह स्ट्रिंग वापस आ जाएगी? मूल्य

class rectangle {
   var print: circle?
}

class circle {
   var area = [radius]()
   var cprint: Int {
      return area.count
   }
   subscript(i: Int) -> radius {
      get {
         return area[i]
      }
      set {
         area[i] = newValue
      }
   }
   func circleprint() {
      print("The number of rooms is \(cprint)")
   }
   var rectarea: circumference?
}

class radius {
   let radiusname: String
   init(radiusname: String) { self.radiusname = radiusname }
}

class circumference {
   var circumName: String?
   var circumNumber: String?
   var circumarea: String?

   func buildingIdentifier() -> String? {
      if circumName != nil {
         return circumName
      } else if circumNumber != nil {
         return circumNumber
      } else {
         return nil
      }
   }
}

let circname = rectangle()

if let radiusName = circname.print?[0].radiusname {
   print("The first room name is \(radiusName).")
} else {
   print("Radius is not specified.")
}

जब हम खेल के मैदान का उपयोग करके उपरोक्त कार्यक्रम चलाते हैं, तो हमें निम्नलिखित परिणाम मिलते हैं -

Radius is not specified.

उपरोक्त कार्यक्रम में, सदस्यता फ़ंक्शन 'त्रिज्यानाम' के लिए उदाहरण मान निर्दिष्ट नहीं है। इसलिए, फ़ंक्शन के लिए प्रोग्राम कॉल केवल दूसरे भाग को लौटाएगा जबकि मूल्यों को वापस करने के लिए हमें विशेष सदस्यता फ़ंक्शन के लिए मानों को परिभाषित करना होगा।

यदि पुनर्प्राप्ति प्रकार पहले से ही वैकल्पिक है, तो वैकल्पिक श्रृंखलन भी एक वैकल्पिक मान लौटाएगा। उदाहरण के लिए अगर स्ट्रिंग? वैकल्पिक श्रृंखलन के माध्यम से पहुँचा है यह स्ट्रिंग वापस आ जाएगी? मूल्य ..

class rectangle {
   var print: circle?
}

class circle {
   var area = [radius]()
   var cprint: Int {
      return area.count
   }
   subscript(i: Int) -> radius {
      get {
         return area[i]
      }
      set {
         area[i] = newValue
      }
   }
   func circleprint() {
      print("The number of rooms is \(cprint)")
   }
   var rectarea: circumference?
}

class radius {
   let radiusname: String
   init(radiusname: String) { self.radiusname = radiusname }
}

class circumference {
   var circumName: String?
   var circumNumber: String?
   var circumarea: String?
   
   func buildingIdentifier() -> String? {
      if circumName != nil {
         return circumName
      } else if circumNumber != nil {
         return circumNumber
      } else {
         return nil
      }
   }
}

let circname = rectangle()
circname.print?[0] = radius(radiusname: "Diameter")
let printing = circle()

printing.area.append(radius(radiusname: "Units"))
printing.area.append(radius(radiusname: "Meter"))
circname.print = printing

if let radiusName = circname.print?[0].radiusname {
   print("Radius is measured in \(radiusName).")
} else {
   print("Radius is not specified.")
}

जब हम खेल के मैदान का उपयोग करके उपरोक्त कार्यक्रम चलाते हैं, तो हमें निम्नलिखित परिणाम मिलते हैं -

Radius is measured in Units.

उपरोक्त कार्यक्रम में, सदस्यता फ़ंक्शन 'त्रिज्यानाम' के लिए उदाहरण मान निर्दिष्ट है। इसलिए, फ़ंक्शन को प्रोग्राम कॉल अब मान लौटाएगा।

वैकल्पिक रिटर्न मान के साथ तरीकों पर जंजीर

वैकल्पिक chaining का उपयोग उपवर्गों परिभाषित विधियों तक पहुँचने के लिए किया जाता है।

class rectangle {
   var print: circle?
}

class circle {
   var area = [radius]()
   var cprint: Int {
      return area.count
   }
   subscript(i: Int) -> radius {
      get {
         return area[i]
      }
      set {
         area[i] = newValue
      }
   }
   func circleprint() {
      print("Area of Circle is: \(cprint)")
   }
   var rectarea: circumference?
}

class radius {
   let radiusname: String
   init(radiusname: String) { self.radiusname = radiusname }
}

class circumference {
   var circumName: String?
   var circumNumber: String?
   var circumarea: String?
   
   func buildingIdentifier() -> String? {
      if circumName != nil {
         return circumName
      } else if circumNumber != nil {
         return circumNumber
      } else {
         return nil
      }
   }
}

let circname = rectangle()

if circname.print?.circleprint() != nil {
   print("Area of circle is specified)")
} else {
   print("Area of circle is not specified")
}

जब हम खेल के मैदान का उपयोग करके उपरोक्त कार्यक्रम चलाते हैं, तो हमें निम्नलिखित परिणाम मिलते हैं -

Area of circle is not specified