स्विफ्ट शब्दकोश: सरणी के रूप में मान प्राप्त करें


150

मेरे पास एक शब्द है जिसमें UIColorएक enum मान द्वारा hashed वस्तुएँ हैं ColorScheme:

var colorsForColorScheme: [ColorScheme : UIColor] = ...

मैं इस शब्दकोश में निहित सभी रंगों (मूल्यों) की एक सरणी निकालने में सक्षम होना चाहता हूं। मैंने सोचा था कि मैं valuesसंपत्ति का उपयोग कर सकता हूं , जैसा कि शब्दकोश मूल्यों ( for value in dictionary.values {...}) पर पुनरावृत्ति होने पर उपयोग किया जाता है , लेकिन यह एक त्रुटि देता है:

let colors: [UIColor] = colorsForColorSchemes.values
                        ~~~~~~~~~~~~~~~~~~~~~^~~~~~~
'LazyBidrectionalCollection<MapCollectionView<Dictionary<ColorScheme, UIColor>, UIColor>>' is not convertible to 'UIColor'

ऐसा लगता है कि Arrayमूल्यों की वापसी के बजाय , valuesविधि अधिक सार संग्रह प्रकार लौटाती है। क्या लूप Arrayमें निकाले बिना शब्दकोश के मानों को प्राप्त करने का एक तरीका है for-in?


1
स्विफ्ट 5: colorsForColorSchemes.values
जुआन बोरो

जवाबों:


284

स्विफ्ट 2.0 के रूप में, Dictionaryकी valuesसंपत्ति अब एक रिटर्न LazyMapCollectionएक के बजाय LazyBidirectionalCollectionArrayप्रकार जानता है इस सार संग्रह प्रकार का उपयोग कर खुद को आरंभ करने के लिए कैसे:

let colors = Array(colorsForColorSchemes.values)

स्विफ्ट के प्रकार का निष्कर्ष पहले से ही पता है कि ये मूल्य UIColorवस्तुएं हैं, इसलिए किसी भी प्रकार की कास्टिंग की आवश्यकता नहीं है, जो अच्छा है!


1
आप इसे टाइप की गई वस्तुओं के साथ एक सरणी के रूप में भी डाल सकते हैं। बहुत अच्छा काम करता है! धन्यवाद रंग = [CustomColorObject] (colorForColorSchemes.values)
bolnad

6
ऐसा लगता है कि स्विफ्ट 2.0 में, Dictionary.values ​​अब LazyMapCollection को LazyBidirectionalCollection के विपरीत लौटाता है। दुर्भाग्य से, .array को LazyMapCollection पर परिभाषित नहीं किया गया है। हालाँकि, ऐरे (डिक्शनरी) तरीके अभी भी ठीक काम करते हैं क्योंकि सरणी प्रकार जानता है कि कैसे एक LazyMapCollection से खुद को शुरू करना है।
टॉड कनिंघम

8
ध्यान दें कि मूल्यों का क्रम अप्रत्याशित हो सकता है। उदाहरण के लिए [0: "small", 1: "medium", 2: "large"]संभवतः उत्पन्न नहीं होगा["small", "medium", "large"]
साइमन बेंग्सन

55

आप मानों की एक सरणी में मैप कर सकते हैं:

let colors = colorsForColorScheme.map { $0.1 }

क्लोजर शब्दकोश से एक कुंजी-मूल्य टपल लेता है और केवल एक मूल्य देता है। इसलिए, मैप फ़ंक्शन मानों की एक सरणी पैदा करता है।

समान कोड का अधिक पठनीय संस्करण:

let colors = colorsForColorScheme.map { (scheme, color) in
    return color
}

अपडेट करें

Xcode 9.0 से, valuesसंपत्ति का उपयोग करके शब्दकोश मूल्यों तक पहुँचा जा सकता है , जो Collectionप्रोटोकॉल के अनुरूप है :

let colors = colorsForColorScheme.values

आमतौर पर आप इसे एक सरणी के रूप में चाहते हैं:

let colors = Array(dict.values)

और बस।


2
लेकिन असल में इस सरणी प्राप्त करने के लिए पठनीय तरीका है जाने रंग = सरणी (colorsForColorScheme.values)
Renetik

1
इस समाधान से प्यार करें
नेवी सील

@pjuzeliunas के बाद से यह यहाँ सबसे अच्छा जवाब है, मैं सिर्फ 2020 के लिए नवीनतम में संपादित किया। स्पष्ट रूप से खोलना, संपादित करना आदि! चीयर्स और धन्यवाद!
फटी


8

आप पर एक एक्सटेंशन बना सकते हैं LazyMapCollection

public extension LazyMapCollection  {

    func toArray() -> [Element]{
        return Array(self)
    }
}

colorsForColorSchemes.values.toArray() या colorsForColorSchemes.keys.toArray()


3

सबसे पहले, निम्नलिखित कथन से, ऐसा लगता है कि आपका चर (शब्दकोश) नाम है colorsForColorScheme

var colorsForColorScheme: [ColorScheme : UIColor] = ... 

जब आप colorsForColorSchemesशब्दकोश से मूल्यों को प्राप्त करने की कोशिश कर रहे हैं जब आपने किया था-

let colors: [UIColor] = colorsForColorSchemes.values

जो आपको एक संकलन समय त्रुटि दे। वैसे भी मैं मान रहा हूं कि आपके पास एक टाइपो था, और आप शब्दकोश का नाम है colorsForColorSchemes। तो, यहाँ समाधान है-

जैसा कि पहले उल्लेख किया गया है, स्विफ्ट में प्रकार की अनुमान संपत्ति के कारण, आपका कोड यह अनुमान लगा सकता है कि .valuesफ़ंक्शन से लौटा हुआ प्रकार UIColor की एक सरणी लौटा रहा है। हालाँकि, स्विफ्ट टाइप-सेफ़ होना चाहता है, इसलिए जब आप colorsऐरे में वैल्यूज़ स्टोर करते हैं , तो आपको उसे स्पष्ट रूप से परिभाषित करना होगा। 5 और इसके बाद के संस्करण के लिए, अब आप निम्नलिखित कर सकते हैं-

let colors = [UIColor](colorsForColorSchemes.values)

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.