2016-08-10 2 views
2

Ich sammle Statistiken in ein Wörterbuch:Wie ändere ich eine 'Any' Variable, indem ich zuerst nach ihrem Typ suche?

var metrics = [String:Any] 

Diese Metriken Ints sein können, Doubles, Streicher, so versuche ich, Alle zu verwenden.

ich initialisieren eine Metrik wie folgt aus:

metrics["sentBeacons"] = UInt(0) 

Aber jetzt, wenn ich versuche, es zu ändern, der Compiler wirft einen Fehler:

metrics["sentBeacons"]! += 1 // Error: can't apply Int to Any? 

die ich verstehe, kann es nicht wissen, dass Dieser Schlüssel hat eine Int.

Ich habe versucht:

if metrics["sentBeacons"] is UInt { 
    metrics["sentBeacons"]! += 1 
} 

aber keine Würfel. Ich habe auch versucht eine Schublade gesteckt:

if var sentBeacons = metrics["sentBeacons"] as? UInt { 
    sentBeacons += 1 
} 

Aber das funktioniert auch nicht, weil (glaube ich) das Wörterbuch ein Werttyp ist, und ich bin nur eine Kopie der Variablen zugreifen.

Wie kann ich den Compiler fragen: "Wenn 'Any' jetzt ein Int ist, dann füge '1' hinzu (an Ort und Stelle)"?

Antwort

4

Sie könnten Ihren Wörterbuch mit Ihrem neuen berechneten Wert aktualisiert:

if var sentBeacons = metrics["sentBeacons"] as? UInt { 
    sentBeacons += 1 
    metrics["sentBeacons"] = sentBeacons 
} 
+0

Verdammt, du hast mich um 30 Sekunden geschlagen! – Addison

+0

Ich war auf beiden Seiten davon. :) –

+0

So offensichtlich, im Nachhinein. Vielen Dank! – abreis

1

ich mich für dieses eine Erweiterung vorgenommen, um die Lese- zu kapseln/ändern/Schritte schreiben, wenn sie mit Wörterbücher Umgang:

extension Dictionary { 
    func transformValue(forKey key: Key, valueTransformer: (oldValue: Value?) -> Value) -> Dictionary { 
     var copy = self 
     copy[key] = valueTransformer(oldValue: self[key]) 
     return copy 
    } 
} 

metricts.transformValue(forKey: "sentBeacons"){UInt($0!) + 1} 
Verwandte Themen