Walker Sorensen
Walker Sorensen

Reputation: 37

How to split string into Int:String Dictionary

So I'm trying to split a string that would look like this:

let Ingredients = "1:egg,4:cheese,2:flour,50:sugar"

and I'm attempting to get a dictionary output like this

var decipheredIngredients : [Int:String] = [

1 : "egg",
4 : "cheese",
2 : "flour",
50 : "sugar"

]

Here is the code that I am attempting this with

func decipherIngredients(input: String) -> [String:Int]{
    let splitStringArray = input.split(separator: ",")
    var decipheredIngredients : [String:Int] = [:]
    for _ in splitStringArray {
        decipheredIngredients.append(splitStringArray.split(separator: ":"))
    }

    return decipheredIngredients
}

When I try this I get an error saying I can't append to the dictionary. I've tried other methods like this:

func decipherIngredients(input: String) -> [String.SubSequence]{
    let splitStringArray = input.split(separator: ",")
    return splitStringArray
}

let newThing = decipherIngredients(input: "1:egg,4:cheese,2:flour,50:sugar").split(separator: ":")
print(newThing)

but I get this as the output of the function

[ArraySlice(["1:egg", "4:cheese", "2:flour", "50:sugar"])]

Upvotes: 3

Views: 2739

Answers (2)

Dennis Vennink
Dennis Vennink

Reputation: 1183

An alternative approach using Swift 4 and functional programming:

let ingredients = "1:egg,4:cheese,2:flour,50:sugar"

let decipheredIngredients = ingredients.split(separator: ",").reduce(into: [Int: String]()) {
  let ingredient = $1.split(separator: ":")

  if let first = ingredient.first, let key = Int(first), let value = ingredient.last {
    $0[key] = String(value)
  }
}

print(decipheredIngredients)

Upvotes: 9

Sameh Salama
Sameh Salama

Reputation: 777

Swift 3

try this, assuming you want dictionary keys of type Int and values of type String

func decipherIngredients(_ input: String) -> [Int:String] {

    var decipheredIngredients : [Int:String] = [:]

    let keyValueArray = input.components(separatedBy: ",")

    for keyValue in keyValueArray {
        let components = keyValue.components(separatedBy: ":")
        decipheredIngredients[Int(components[0])!] = components[1]
    }

    return decipheredIngredients

}

Upvotes: 2

Related Questions