2014-11-18 14 views
85

के रूप में मान जाओ मैं एक शब्दकोश UIColor वस्तुओं एक enum मान द्वारा टुकड़ों में बांटा, ColorScheme युक्त है:स्विफ्ट शब्दकोश: सरणी

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

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

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

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

उत्तर

191

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

let colors = Array(colorsForColorSchemes.values) 

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

+0

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

+6

यह स्विफ्ट 2.0, शब्दकोश में दिखता है। अब एक LazyBidirectionalCollection के विपरीत एक LazyMapCollection लौटाता है। दुर्भाग्यवश, .aray को LazyMapCollection पर परिभाषित नहीं किया गया है। हालांकि, ऐरे (dictionary.values) तरीका अभी भी ठीक काम करता है क्योंकि सरणी प्रकार जानता है कि कैसे LazyMapCollection से खुद को प्रारंभ करना है। –

+4

ध्यान दें कि मानों का क्रम अप्रत्याशित हो सकता है। उदाहरण के लिए '[0:" छोटा ", 1:" मध्यम ", 2:" बड़ा "]' शायद * नहीं * उत्पन्न होगा ["छोटा", "मध्यम", "बड़ा"] ' –

26

तुम भी मूल्यों की एक सरणी के लिए शब्दकोश मैप कर सकते हैं:

let colors = colorsForColorScheme.map { $0.1 } 

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

5

आप पर LazyMapCollection

public extension LazyMapCollection { 

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

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

1

उपयोग colorsForColorScheme.map({$0.value})

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