2015-10-16 5 views
6

Devo convertire un Dictionary con chiavi maiuscole nello stesso esatto Dictionary ma con solo chiavi minuscole.Chiavi minuscole in Swift

Ecco il mio tentativo (Funziona, ma ho trovato questa implementazione estremamente ruvida)

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

si può suggerire un modo più elegante per risolvere questo problema?

+0

vi consiglio di spostare questa domanda a http://codereview.stackexchange.com/ – Arbitur

+0

Cercavi "valori generici" invece di "generici chiavi "? – Cosyn

+0

@Cosyn probabilmente l'aggettivo "generico" non è la parola giusta:/Volevo dire che le chiavi potrebbero essere in minuscolo, maiuscolo o entrambi ... Ho aggiornato la domanda. – MatterGoal

risposta

5

cambia il suo proprie chiavi, senza la necessità di un dizionario temporanea;)

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

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

print(dict) 

[hej: DÅ, nej: tack]

EDIT

Ho fatto questa estensione, è un po 'sporca per ora ma lo aggiornerò di nuovo.

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": "DA", "nej": "virare"]

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

fantastico, è davvero ... pulito! – MatterGoal

+1

@MatterGoal L'ho aggiornato, check it out! : D – Arbitur

2

Smth come quello?

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

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

Questo non funziona se le chiavi del dizionario originale sono eterogenee. OP ha detto che le chiavi erano "generiche", l'ho interpretato come "eterogeneo": le chiavi possono avere un altro tipo rispetto a String. – Moritz

+3

Il "carattere minuscolo" ha un significato per tipi di dati diversi da 'String'? –

+0

@MatterGoal è la soluzione giusta per te? – katleta3000

-1

Proprio come alternativa ai loop, è possibile utilizzare la funzione 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

Ecco la mia soluzione, nessuna fusione forza , totalmente sicuro.

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

risposta di Arbitur, aggiornato per Swift 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) 
     } 
    } 
} 
Problemi correlati