Reputation: 1015
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
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 id
s 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