I have a class that implements the Equatable protocol, and it uses a UUID field for comparison:
class MemberViewModel {
private static var entities: [MemberViewModel] = []
private var entity: Member
let id = UUID()
init(_ entity: Member) {
self.entity = entity
}
static func members() -> [MemberViewModel] {
entities.removeAll()
try? fetch().forEach { member in
entities.append(MemberViewModel(member))
}
return entities
}
}
extension MemberViewModel: Equatable {
static func == (lhs: MemberViewModel, rhs: MemberViewModel) -> Bool {
return lhs.id == rhs.id
}
}
I then have a view that creates icons that when tapped should display a stroke to denote it was "selected":
struct MyView: View {
@State var selectedMember: MemberViewModel? = nil
var body: some View {
let members = MemberViewModel.members()
ScrollView(.horizontal, showsIndicators: true) {
HStack(alignment: .top, spacing: 4) {
ForEach (members, id: \.id) { member in
var isSelected: Bool = selectedMember == member
Circle()
.fill(Color(.red))
.frame(width: 48, height: 48)
.overlay() {
if isSelected {
Circle()
.stroke(Color(.black), lineWidth: 2)
}
}
.onTapGesture { selectedMember = member }
}
}
}
}
}
I have tried setting isSelected multiple ways, including the following from another SO question:
let isSelected = Binding<Bool>(get: { self.selectedMember == member }, set: { _ in })
When debugging using breakpoints, the value of isSelected is always false.
I'm using XCode Version 14.0.1 (14A400), and Swift 5.7.
https://developer.apple.com/documentation/swiftui/pickeryou will get much more ideasMemberViewModel, you probably wantedstatic var entities: [Member] = []and similarly instatic func members() -> [Member]. Currently you have aMemberViewModelthat contains an array ofMemberViewModelthat contains an array ofMemberViewModel, that contains.....etc..,etc... Make theextension Member: Equatable {...}selectedMembertomember, given that theEquatableis using theUUIDthat is defined inMemberViewModel, but it is by design that I am abstracting away access to theMemberobject.strangeone you have.selectedMemberat the point where you do the comparison? I wonder if the fact that it is a property wrapped variable is screwing it up.