Swift d'erreur lorsque vous essayez d'accéder Dictionnaire: `impossible de trouver un membre "indice"
Ce ne compile pas:
J'ai essayé un couple de différentes choses; différentes façons de déclarer le Dictionnaire, la modification de son type pour correspondre à la nested-ness de données. J'ai aussi essayé de le dire explicitement mon Any
était une collection de sorte qu'il pourrait être indicé. Pas de dés.
import UIKit
import Foundation
class CurrencyManager {
var response = Dictionary<String,Any>()
var symbols = []
struct Static {
static var token : dispatch_once_t = 0
static var instance : CurrencyManager?
}
class var shared: CurrencyManager {
dispatch_once(&Static.token) { Static.instance = CurrencyManager() }
return Static.instance!
}
init(){
assert(Static.instance == nil, "Singleton already initialized!")
getRates()
}
func defaultCurrency() -> String {
let countryCode = NSLocale.currentLocale().objectForKey(NSLocaleCountryCode) as String
let codesToCountries :Dictionary = [ "US":"USD" ]
if let localCurrency = codesToCountries[countryCode]{
return localCurrency
}
return "USD"
}
func updateBadgeCurrency() {
let chanCurr = defaultCurrency()
var currVal :Float = valueForCurrency(chanCurr, exchange: "Coinbase")!
UIApplication.sharedApplication().applicationIconBadgeNumber = Int(currVal)
}
func getRates() {
//Network code here
valueForCurrency("", exchange: "")
}
func valueForCurrency(currency :String, exchange :String) -> Float? {
return response["current_rates"][exchange][currency] as Float
}
}
OriginalL'auteur rsmoz | 2014-06-09
Vous devez vous connecter pour publier un commentaire.
Prenons un coup d'oeil à
response
est déclarée commeDictionary<String,Any>()
, donc après le premier indice que vous essayez d'appeler un autre deux indices sur un objet de type Quelconque.Solution 1. Changer le type de la réponse à être imbriquée dictionnaire. Notez que j'ai ajouté les points d'interrogation, car à tout moment vous avez accès à un article de dictionnaire, vous obtenez en retour facultatif.
La Solution 2. Cast chaque niveau pour un Dictionnaire que vous analysez. Assurez-vous de toujours vérifier si les valeurs facultatives existent.
let exchanges = response["current_rates"] as Dictionary?
J'ai "ne Pouvait pas trouver une surcharge pour les indices qui accepte les arguments fournis"
J'ai ajouté une deuxième solution. Pour utiliser cette méthode, vous avez juste besoin de mettre le point d'interrogation après "que" au lieu d'après "Dictionnaire"
De toute façon de le faire sans le coder en dur les types imbriqués? (c'est à dire mon commentaire d'Alex réponse)
Il suffit d'ajouter le type d'élément:
let symbols = response["symbols"] as? Array<ElementType>
OriginalL'auteur Dash
Vous pouvez obtenir imbriquée dictionnaire de données en suivant ces étapes:
OriginalL'auteur Dilip Patidar
OriginalL'auteur mwhuss
response
est déclaré en tant que tel:De sorte que le compilateur
response["current_rates"]
sera de retour uneAny
. Qui peut ou ne peut pas être quelque chose qui est l'indice indexables.Vous devriez être en mesure pour vous définir le type avec imbriqué Dictionnaires, 3 niveaux et, finalement, vous arrivez à un flotteur. Vous avez également besoin de percer dans avec en option le chaînage depuis le dictionnaire peut ou ne peut pas avoir une valeur pour la clé, c'est donc l'indice d'accesseur renvoie une option.
Ensuite, vous aurez besoin de vérifier les types et les remettre lors de l'exécution.
La chose est, je sais que les types spécifiques des éléments que je veux, et je voudrais d'ignorer les autres. Si j'ai accès ["current_rates"], je sais que je vais toujours obtenez un dictionnaire.
OriginalL'auteur Alex Wayne