2017-03-06 6 views
6

मैं इस कोड है। आम तौर पर, मैं इसे इस तरह से तय:

let s: String? = Enum(rawValue: "A")?.rawValue 

हालांकि, Xcode कि मैं .map { $0.rawValue } जोड़ना चाहिए कहते हैं:

enter image description here

यह अजीब है क्योंकि स्पष्ट रूप से, Xcode पता है कि तक पहुँचने rawValue में Enum बदल सकते है एक String। लेकिन यह map का उपयोग करके ऐसा करने का सुझाव क्यों देता है? क्यों न सिर्फ इसे सीधे एक्सेस करें?

मैंने सोचा था कि Xcode इस तरह से लगता होगा:

मैं एक स्ट्रिंग को छोड़ दिया और एक enum जिसका कच्चे मूल्य स्ट्रिंग है पर लगातार मिल गया है। प्रकार संगत नहीं हैं, लेकिन मुझे पता है कि rawValue एनम को स्ट्रिंग में बदल सकता है। मैं बस उपयोगकर्ता को ?.rawValue जोड़ने का सुझाव दूंगा!

इसके पीछे एक्सकोड की "सोच प्रक्रिया" क्या है?

पीएस मेरा इरादा यह जांचना है कि "A" एक enum के लिए एक वैध कच्चे मूल्य है या नहीं। यदि ऐसा है, तो इसे s पर असाइन करें, अन्यथा nil असाइन करें। मुझे पता है कि यह बहुत व्यावहारिक नहीं है, लेकिन मैं सिर्फ एक्सकोड के व्यवहार से चिंतित हूं।

+1

बस खेल का मैदान पर यह कोशिश की, अपने प्रारंभिक ठीक वहाँ काम करता है। उत्सुकता कि एक्सकोड 'मानचित्र' का उपयोग करके "सोच" कैसे समस्या को ठीक करेगा। – antonio081014

+4

असल में, मुझे आश्चर्य है कि एक्सकोड पहले से ही इसे ठीक करने के लिए पर्याप्त स्मार्ट है। – Hamish

+1

कृपया उस प्रतिकूल सामग्री के साथ एक्सकोड को परेशान न करें जो आपको - डेवलपर - संकलन समय पर जानना चाहिए। एनम के मामले रनटाइम पर नहीं बदल सकते हैं, इसलिए एक संभावित क्रैश स्पष्ट रूप से डेवलपर त्रुटि को प्रकट करता है। – vadian

उत्तर

4

जोआओ सूजा मार्सेलो की तीसरी जवाब के लिए सिर्फ वाक्य रचना चीनी बिल्कुल सही है। .map वैकल्पिक सुरक्षित-अनचाहे विधि उत्कृष्टता है। Enum(rawValue: "A").map{$0.rawValue}Enum(rawValue: "A")?.rawValue है।

समस्या यह है कि हम सभी को दूसरे (सिंटैक्टिक चीनी) का उपयोग करने के लिए उपयोग किया जाता है, जिसे हम भूल जाते हैं कि पहला यह है कि स्विफ्ट कंपाइलर वास्तव में हुड के नीचे कैसे सोचता है।

उदाहरण:

var i : [Int]? = [7] 
i.map {$0.count} // 1 
i?.count // 1 

i = nil 
i.map {$0.count} // nil 
i?.count // nil 
2

यह Enum के लिए विशिष्ट नहीं है। वास्तव में, सभी Optional उदाहरणों map function लागू:

  1. वर्णमाला क्रम:

    let possibleNumber: Int? = Int("4") 
    let possibleSquare = possibleNumber.map { $0 * $0 } 
    print(possibleSquare) // Prints "Optional(16)" 
    

    मैं क्यों Xcode पता चलता है कि बजाय सिर्फ .rawValue लेकिन मैं कुछ संभावित कारणों के बारे में सोच सकते हैं यकीन नहीं है।

  2. आप अनचाहे मूल्य पर कुछ ऑपरेशन करना चाहते हैं।
  3. शायद foo?.barfoo.map { $0.bar }
+0

3 बिल्कुल सही है। – matt

+0

क्या आप समझा सकते हैं कि वर्णमाला क्रम से आपका क्या मतलब है? – Sweeper

+0

वर्णमाला क्रम: (एम) एपी पहले (आर) awValue है। लेकिन यह मूर्ख है। 3 मेरी सबसे अच्छी शर्त है। –

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