2015-11-12 8 views
31

मुझे अजीब तेज़ व्यवहार दिखाई देता है, क्योंकि मेरी राय में रंग परिवर्तनीय को नीचे लिखे गए स्विच के मामले में अवांछित बल नहीं दिया जाना चाहिए, लेकिन संकलक को अनचाहे किए बिना मुझे एक त्रुटि संदेश दिखाता है। enter image description hereएनम और स्विच के मामले में अवांछित बल की आवश्यकता क्यों है?

मेरी राय में यह है तेज विसंगति, किसी को भी कुछ विचार है:

enum Colours: Int { 
case Red = 0, White, Black 
} 

var colours: Colours! 
colours = .Red 

switch colours! { // <-- why I have to unwrap colours? As you can see colours are declared as '!' 
case .Red: break 
default: break 
} 

अगर रंग चर unwrapped संकलक नहीं है मुझे उस त्रुटि दिखाता है?

उत्तर

32

जब एक switch बयान में इस्तेमाल किया, यहां तक ​​कि परोक्ष unwrapped optionals नहीं स्वचालित रूप से unwrapped हैं। (ए कारण हो सकता है कि आप अन्यथा nil के खिलाफ उनकी बराबरी नहीं कर सका।)

तो तुम खोलने में है (या तो colours! जो जबरन साथ दुर्घटना होगा अगर colours == nil, या वैकल्पिक रूप से बाध्यकारी के साथ), या - वैकल्पिक रूप से - के खिलाफ मैच .Red? जो .Some(.Red) के लिए एक शॉर्टकट है:

var colours: Colours! 

switch colours { 
case .Red?: 
    break // colours is .Red 
default: 
    break // colours is .White, .Black or nil 
} 

ही अन्य पैटर्न मिलान भाव, जैसे के लिए रखती है!

if case .Red? = colours { 
    // colours is .Red 
} else { 
    // colours is .White, .Black or nil 
} 

इसके अलावा इस गणन प्रकार के साथ कोई लेना देना नहीं है, केवल एक पैटर्न में परोक्ष unwrapped optionals साथ है:

let x : Int! = 1 

switch x { 
case nil: 
    break // x is nil 
case 1?: 
    break // x is 1 
default: 
    break // x is some other number 
} 
+0

आपके कुछ रंगों में से कुछ रंग हैं ;-) – vacawama

+0

@ वाकावामा: स्वत: सुधार को दोष दें :) –

+0

हां! Autocorrection भी मेरी टिप्पणी को सही कर रहा था। यद्यपि दोष वास्तव में नोहा वेबस्टर से संबंधित हो सकता है। :-) – vacawama

2

ऐसा इसलिए है क्योंकि आप colours वैकल्पिक प्रकार की तरह चर बनाते हैं। आप इस तरह से करते हैं:

var colours: Colours 
colours = .Red 

आप यह मान unwrappe को

अगर हम क्या वैकल्पिक प्रकार है को देखो, हम चाहते हैं कि इस enum की तरह है देखेंगे के लिए नहीं होगा:

enum Optional<T> { 
    case Some(T) 
    case None 
} 

और यह Some उदाहरण के लिए Int जैसे None और इस मामले में इसका शून्य मूल्य हो सकता है।

var colours: Colours! 

आप सीधे ! ने संकेत दिया है कि इस Colours प्रकार नहीं है लेकिन इस enum ImplicitlyUnwrappedOptional<Colours> प्रकार है:

जब आप यह कर सकते हैं। सृजन के पल में यह Some<Colours> होगा यदि यह बराबर है लेकिन ! के साथ आपके पास यह है कि यह enum ImplicitlyUnwrappedOptional<Colours> है और अगले कुछ पल में यह None होगा।

आपका colours मूल्य ImplicitlyUnwrappedOptional<Colours> प्रकार है और यह Colours या nil हो सकता है और आप सीधे संकेत मिलता है कि इस `switch`` में Colours प्रकार है: यह आप क्यों उपयोग करने के लिए switch में ! है है।

+1

आप कुछ के साथ 'एक चर घोषणा की कि दिखा दस्तावेज प्रदान कर सके' यह वैकल्पिक बना देता है ? – Arc676

+0

@ Arc676 मैं उत्तर संपादित करता हूं –

+1

'रंगों' में 'ImplicitlyUnwrappedOptional ' प्रकार है, न कि 'वैकल्पिक '। –

1
उपयोग करने के बजाय

:

var colours: Colours! 
colours = .Red 

, बस का उपयोग

var colours = Colours.Red 

कि चाल करना चाहिए।

+1

लेकिन मैं वैकल्पिक रंग परिवर्तनीय होना चाहता हूं। इसे '!' के बिना काम करना चाहिए मेरी राय में। – Robert

+2

@roher वैकल्पिक रूप से एक enum प्रकार चर को घोषित करना बहुत उपयोगी नहीं है क्योंकि एक enum को एक निश्चित स्थिति के लिए डिज़ाइन किया गया है। वैकल्पिक 'के बजाय' .None' स्थिति या समान का उपयोग करें। – vadian

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