2015-10-16 51 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) 
     } 
    } 
}