John
John

Reputation: 1015

Issue combining 2 separate sets | Swift

I currently have 2 sets recordSet that is a simple string set and issueSet that is based on the struct selectedIssuesStruct

var recordSet:Set<String>

issueSet: Set<selectedIssuesStruct> = []

struct selectedIssuesStruct : Codable, Hashable {
    var name: String
    var id: Int
}

I am working with both sets at the following state when they look like this:

recordSet: ["Jake", "Mary", "Tim"]

issueSet: [
myApp.selectedIssuesStruct(name: "", id: 4), 
myApp.selectedIssuesStruct(name: "", id: 3), 
myApp.selectedIssuesStruct(name: "", id: 2)
]

Note: name is meant to be blank at this point, when id is populated name is not passed, resulting in an empty string. How can I populate each name from record set into issueSet as many times there are issues? To avoid confusion, please see the result I am trying to get to.

Result I am trying to get to:

issueSet: [
myApp.selectedIssuesStruct(name: "Jake", id: 4), 
myApp.selectedIssuesStruct(name: "Jake", id: 3), 
myApp.selectedIssuesStruct(name: "Jake", id: 2),
myApp.selectedIssuesStruct(name: "Mary", id: 4), 
myApp.selectedIssuesStruct(name: "Mary", id: 3), 
myApp.selectedIssuesStruct(name: "Mary", id: 2),
myApp.selectedIssuesStruct(name: "Tim", id: 4), 
myApp.selectedIssuesStruct(name: "Tim", id: 3), 
myApp.selectedIssuesStruct(name: "Tim", id: 2)
]

Upvotes: 0

Views: 47

Answers (1)

jnpdx
jnpdx

Reputation: 52397

You can iterate over recordSet using flatMap -- this will map over each element letting you return an array that will then be flattened at the end of the process into a single dimensional array (not a 2-dimensional array as you would get if you just used map).

Within the flatMap, you can create a SelectedIssuesStruct that takes the name from the recordSet and pairs it with the ids from the issueSet

struct SelectedIssuesStruct : Codable, Hashable {
    var name: String
    var id: Int
}

let recordSet:Set<String> = ["Jake", "Mary", "Tim"]

let issueSet: Set<SelectedIssuesStruct> = [
    SelectedIssuesStruct(name: "", id: 4),
    SelectedIssuesStruct(name: "", id: 3),
    SelectedIssuesStruct(name: "", id: 2)
]

let result = recordSet.flatMap { name in
    issueSet.map { issue in
        SelectedIssuesStruct(name: name, id: issue.id)
    }
}
print(result)

This yields the following (remember that Set is unordered):

[SelectedIssuesStruct(name: "Tim", id: 4), SelectedIssuesStruct(name: "Tim", id: 3), SelectedIssuesStruct(name: "Tim", id: 2), SelectedIssuesStruct(name: "Jake", id: 4), SelectedIssuesStruct(name: "Jake", id: 3), SelectedIssuesStruct(name: "Jake", id: 2), SelectedIssuesStruct(name: "Mary", id: 4), SelectedIssuesStruct(name: "Mary", id: 3), SelectedIssuesStruct(name: "Mary", id: 2)]

Note that I've changed selectedIssuesStruct to SelectedIssuesStruct to follow the Swift naming conventions

Upvotes: 1

Related Questions