2015-10-16 71 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

我建議你提出這個問題http://codereview.stackexchange.com/ – Arbitur

+0

你的意思是「通用的值」,而不是「通用鑰匙「? – Cosyn

+0

@Cosyn可能是「通用」的形容詞是不正確的字:/我想說鍵可能是小寫,大寫字母或兩個......我已經更新的問題。 – MatterGoal

回答

5

改變其自己的鑰匙,而不需要一個臨時的字典;)

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

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

print(dict) 

[HEJ:DA,NEJ:粘性]

編輯

我做了這個擴展,它現在有點髒,但我會再次更新它。

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」: 「粘性」]

EDIT 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我更新了它,查看它! :d – Arbitur

2

水木清華這樣呢?

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

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

如果原始字典密鑰是異構的,則這不起作用。 OP表示這些鍵是「通用」的,我將其解釋爲「heterogenous」:鍵可以具有另一種類型而不是String。 – Moritz

+3

「小寫」對於「String」以外的數據類型有什麼意義嗎? –

+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) 
     } 
    } 
}