2016-06-10 4 views
9

मैं इस कोड में भाग गया जो Swift Algorithm Club में एक लिंक्ड सूची के स्विफ्ट कार्यान्वयन का हिस्सा है। कार्यान्वयन के दौरान लेखक वैकल्पिक रूप से अनचाहे करने से ठीक पहले थोड़ी देर के बाद case let का उपयोग करता है। मैंने स्विच स्टेटमेंट के संदर्भ के बाहर इस्तेमाल किए गए केस कीवर्ड को कभी नहीं देखा है, और मैं सोच रहा हूं कि यह वास्तव में क्या करता है? क्या यह किसी भी तरह let next? = node.next भाग को सही या गलत पर डाला गया है, शायद इस पर निर्भर करता है कि next? शून्य हो गया है या नहीं?स्विफ्ट में स्विच स्टेटमेंट के बिना "केस" का क्या अर्थ है?

public var last: Node? { 
    if var node = head { 
     while case let next? = node.next { 
      node = next 
     } 
     return node 
    } else { 
     return nil 
    } 
} 
+0

संबंधित: http://stackoverflow.com/questions/30720289/swift-2-pattern-matching-in-if। –

+0

यह भी संबंधित है: http://stackoverflow.com/questions/36880109/what-are-the-advantages-use-cases-of-optional-patterns-introduced-in-swift-2/36881836#36881836 – jtbandes

उत्तर

13

यह Optional Pattern है। यह Optional का परीक्षण और अनचाहे करता है, केवल Optional गैर-शून्य होने पर सशर्त निष्पादित करता है।

कीवर्ड case की आवश्यकता है क्योंकि यह मूल switch ... case वाक्यविन्यास से है। case एक पैटर्न का परीक्षण करता है और यदि यह मेल खाता है तो निम्न कथन निष्पादित किया जाता है। आपके उदाहरण में let next? पैटर्न है। यदि मान अनचाहे और असाइन किया गया है तो case मिलान और आपका कोड निष्पादित किया गया है।

प्रलेखन से:

वैकल्पिक पैटर्न

एक वैकल्पिक पद्धति एक वैकल्पिक या ImplicitlyUnwrappedOptional गणन के कुछ (लिपटा) मामले में लिपटे मूल्यों से मेल खाता है। वैकल्पिक पैटर्न में एक पहचानकर्ता पैटर्न होता है जो तुरंत एक प्रश्न चिह्न द्वारा पीछा किया जाता है और उसी स्थान पर गणना गणना पैटर्न के रूप में दिखाई देता है।

क्योंकि वैकल्पिक पैटर्न वैकल्पिक और ImplicitlyUnwrappedOptional गणन मामले पैटर्न के लिए वाक्यात्मक चीनी हैं, निम्न बराबर हैं:

let someOptional: Int? = 42 
// Match using an enumeration case pattern 
if case .Some(let x) = someOptional { 
    print(x) 
} 

// Match using an optional pattern 
if case let x? = someOptional { 
    print(x) 
} 

वैकल्पिक पैटर्न एक में वैकल्पिक मूल्यों का एक सरणी पर पुनरावृति करने के लिए एक सुविधाजनक तरीका प्रदान करता है बयान में, के शरीर को केवल गैर-शून्य तत्वों के लिए लूप निष्पादित करना।

let arrayOfOptionalInts: [Int?] = [nil, 2, 3, nil, 5] 
// Match only non-nil values 
for case let number? in arrayOfOptionalInts { 
    print("Found a \(number)") 
} 
// Found a 2 
// Found a 3 
// Found a 5 
+5

यह मुझे लगता है व्याख्या करने के लिए (काफी अच्छी तरह से) एक वैकल्पिक पैटर्न क्या है, लेकिन * नहीं * क्यों 'केस' की आवश्यकता है, वांछनीय, या यहां तक ​​कि संभव है। यही कारण है कि सवाल क्या पूछ रहा था। – paxdiablo

+4

दृश्यों के पीछे तेजी से विकल्प (जेनेरिक) enums हैं, और प्रत्येक संभव मूल्य को एक एनम ले सकते हैं जिसे 'केस' नाम दिया जाता है (आमतौर पर 'स्विच' कथन के अनुसार कई संभावित मानों में से एक का चयन करने के लिए उपयोग किया जाता है)। वैकल्पिक के दो मामले 'नॉन' (जब' शून्य ') और' कुछ '(जब गैर-शून्य, लिपटे मान के साथ enum मामले के संबंधित मान के रूप में) हैं। मुझे लगता है कि यह वाक्यविन्यास कीवर्ड 'केस' का उपयोग क्यों करता है, भले ही यह' स्विच 'कथन न हो। –

+0

मैंने जो लिंक दिया है, वह "क्यों" समझाता है, वहां से उद्धरण देने के लिए बहुत कुछ था। मैंने एक सरल स्पष्टीकरण जोड़ा कि "क्यों" कीवर्ड की आवश्यकता है लेकिन दस्तावेज़ीकरण अधिक विस्तार से चला जाता है। – ColGraff

3

स्विफ्ट 2 switch/case बयानों से पैटर्न प्रतिमान लिया और वह अन्य संदर्भों (if, while और इसी तरह) में इस्तेमाल किया जा करने की अनुमति दी।

तो अब केवल साधारण तुलना के बजाय, आप सशर्त क्षेत्रों में इन पैटर्न मिलान तुलनाओं का भी उपयोग कर सकते हैं।

एक उदाहरण के रूप में, बजाय:

if (a >= 0) and (a <= 255) 

आप के बजाय का उपयोग कर सकते हैं:

if case 0...255 = a 

एक छोटी सी उदाहरण है कि लेकिन यह भी बहुत कुछ उपयोगी एक बार आप पैटर्न के बजाय बड़ी संख्या का एहसास हो सकता है आपके लिए उपलब्ध मिलान विकल्प।

+0

मुझे लगता है कि इस मामले में '0 ... 255 = ~ ए' को प्राथमिकता दी जाती है। आप शायद 'स्विच-केस' में 'रेंज' की रोकथाम के लिए 'केस' का उपयोग करेंगे। – BallpointBen

संबंधित मुद्दे