Tengo una matriz (de un archivo de constantes globales) que estoy tratando de usar en una llamada a la API para hacer otra matriz de diccionario. La matriz inicial es:

let callCountries = ["AU" : "Australia", "NZ" : "New Zealand", "UK" : "United Kingdom", "ZA" : "South Africa", "US" : "United States"]

Luego solo quiero tomar el código corto del país y recorrerlo para construir una nueva matriz como se muestra a continuación ...

func getCallCentreNumbers(){

    var countrykeys = Array(callCountries.keys)

    API.getJudeContactNumbers({response in

            self.judeCallCentreNumberDict =  [
                countrykeys : (response.value(forKey: countrykeys) as! String),
        ]

    })

}

La línea inicial de código sin que se inserten los valores de la matriz fue:

self.judeCallCentreNumberDict =  [
                "ZM" : (response.value(forKey: "ZM") as! String),
        ]

Quiero reemplazar las "ZM" con la variable countrykeys pero no puedo resolver esta. (Lo siento, todavía soy bastante novato). ¿Alguien puede señalarme en la dirección correcta?

-1
Marcus Smith 13 nov. 2017 a las 22:51

2 respuestas

La mejor respuesta

Sugeriría un bucle a través de la respuesta

Primero intente borrar judeCallCentreNumberDict antes de realizar la solicitud

judeCallCentreNumberDict = [:]

Luego, cuando tenga la respuesta, haga una matriz de las claves y recorrala

(dentro de API.getJudeContactNumbers({response in)

let countrykeys = callCountries.map { $0.key }

countrykeys.forEach {
    guard let value = response.value(forKey: $0) as? String else { return }
    judeCallCentreNumberDict[$0] = value
}

Nota:

  • $0 significa el elemento actual en el ciclo (en este caso será una de las claves)
  • Supongo que judeCallCentreNumberDict es de tipo [String:String], por lo que podemos agregarle solo valores de tipo String no String? y eso es lo que es guard para
1
zombie 13 nov. 2017 a las 20:47

Parece que desea ver cada número en la respuesta y crear un diccionario de los números para cada código de país. Estuvo cerca de esta implementación, pero necesita iterar sobre las claves en countrykeys, mirando el valor de cada clave y asignando ese valor al código de país correspondiente en judeCallCentreNumberDict.

func getCallCentreNumbers() {
    var countrykeys = Array(callCountries.keys)

    API.getJudeContactNumbers { response in
        for countryKey in countryKeys {
            let number = (response.value(forKey: countrykeys) as! String)
            self.judeCallCentreNumberDict[countryKey] = number
        }
    }
}

El código anterior resolverá el problema del compilador, pero parece que este código no es necesario para lo que desea hacer (al menos en el contexto dado). Si todo lo que quiere hacer es realizar esa llamada a la API y obtener un diccionario de números de contacto, parece que la API lo está manejando lo suficiente por usted. Parece que la API ya te está devolviendo un diccionario de números de teléfono. Entonces, el código podría reducirse a algo como el siguiente código. (A menos que la respuesta devuelva JSON, en cuyo caso estas implementaciones fallarán)

func getCallCentreNumbers() {   
    API.getJudeContactNumbers { response in
        self.judeCallCentreNumberDict = response
    }
}
0
keithbhunter 13 nov. 2017 a las 20:02