2015-10-16 8 views
6

में लोअरकेस डिक्शनरी कुंजी मुझे Dictionary को मिश्रित केस कुंजियों के साथ उसी सटीक Dictionary में कनवर्ट करने की आवश्यकता है, लेकिन केवल लोअरकेस कुंजी के साथ। (यह काम करता है, लेकिन मैं इस कार्यान्वयन अत्यंत किसी न किसी तरह मिल गया)स्विफ्ट

extension Dictionary { 
    func lowercaseKeys()->Dictionary<String, AnyObject>{ 
     var newDictionary = Dictionary<String,AnyObject>() 

     for k in keys{ 
      if let k_string = k as? String{ 
       newDictionary[k_string.lowercaseString] = self[k] as? AnyObject 
      } 
     } 
     return newDictionary 
    } 
} 

आप इस समस्या को हल करने के लिए एक और अधिक सुरुचिपूर्ण रास्ता बता सकते हैं

यहाँ मेरी प्रयास है?

+0

मैं सुझाव है कि आप – Arbitur

+0

http://codereview.stackexchange.com/ से यह सवाल घूम रहा है आप "सामान्य मूल्यों" के बजाय आपका मतलब है "सामान्य चांबियाँ"? – Cosyn

+0

@ कोसिन शायद "जेनेरिक" विशेषण सही शब्द नहीं है:/मैं कहना चाहता था कि चाबियाँ लोअरकेस, अपरकेस या दोनों हो सकती हैं ... मैंने प्रश्न अपडेट किया है। – MatterGoal

उत्तर

5

एक अस्थायी शब्दकोश की आवश्यकता के बिना अपने स्वयं के चाबियाँ परिवर्तन;)

var dict = ["HEJ":"DÅ", "NeJ":"tack"] 

for key in dict.keys { 
    dict[key.lowercaseString] = dict.removeValueForKey(key) 
} 

print(dict) 

[हेज: डीएसए, नेज: टक]

EDIT

मैंने यह एक्सटेंशन बनाया है, यह अभी थोड़ा गंदा है लेकिन मैं इसे फिर से अपडेट करूंगा।

extension Dictionary { 
    mutating func lowercaseKeys() { 
     for key in self.keys { 
      let str = (key as! String).lowercaseString 
      self[str as! Key] = self.removeValueForKey(key) 
     } 
    } 
} 

var dict = ["HeJ":"Då", "nEJ":"taCK!"] 
dict.lowercaseKeys() 
print(dict) 

[ "Hej": "दा", "nej": "कील"]

संपादित 2

extension Dictionary where Key: StringLiteralConvertible { 
    mutating func lowercaseKeys() { 
     for key in self.keys { 
      self[String(key).lowercaseString as! Key] = self.removeValueForKey(key) 
     } 
    } 
} 

var dict = ["NamE":"David", "LAST_NAME":"Göransson"] 

dict.lowercaseKeys() // Will compile 

var dict2 = [0:"David", 0:"Göransson"] 

dict2.lowercaseKeys() // Won't compile because Key isn't StringLiteralConvertible 
+0

महान, यह वास्तव में है ... साफ! – MatterGoal

+1

@MatterGoal मैंने इसे अपडेट किया, इसे जांचें! : डी – Arbitur

2

उस तरह की बदबू आ रही है?

var dict = ["KEY": "value"] 
    var newDict = [String: AnyObject]() 

    for (key, value) in dict { 
    newDict[key.lowercaseString] = value 
    } 
+0

यह तब काम नहीं करता है जब मूल शब्दकोश कुंजी विषम हो। ओपी ने कहा कि चाबियाँ "जेनेरिक" थीं, मैं इसे "विषम" के रूप में समझता हूं: चाबियाँ स्ट्रिंग की तुलना में एक और प्रकार हो सकती हैं। – Moritz

+3

क्या "लोअरकेस" का अर्थ 'स्ट्रिंग' के अलावा डेटा प्रकारों के लिए कोई अर्थ है? –

+0

@MatterGoal यह आपके लिए उचित समाधान है? – katleta3000

-1

बस पाशन के लिए एक विकल्प के रूप में, आप map समारोह इस्तेमाल कर सकते हैं:

func lowercaseKeys() -> Dictionary<String, AnyObject> { 
    var newDictionary = Dictionary<String,AnyObject>() 
    Array(keys).map { key in 
     newDictionary[(key as! String).lowercaseString] = self[key] as? AnyObject 
    } 
    return newDictionary 
} 
0

यहाँ मेरी समाधान, कोई बल कास्टिंग है , पूरी तरह से सुरक्षित।

protocol LowercaseConvertible { 
    var lowercaseString: Self { get } 
} 

extension String: LowercaseConvertible {} 

extension Dictionary where Key: LowercaseConvertible { 
    func lowercaseKeys() -> Dictionary { 
     var newDictionary = Dictionary() 

     for k in keys { 
      newDictionary[k.lowercaseString] = self[k] 
     } 
     return newDictionary 
    } 
} 
1

Arbitur का जवाब, स्विफ्ट 3 के लिए अद्यतन:

extension Dictionary where Key: ExpressibleByStringLiteral { 
    public mutating func lowercaseKeys() { 
     for key in self.keys { 
      self[String(describing: key).lowercased() as! Key] = self.removeValue(forKey: key) 
     } 
    } 
}