我的代码中有一个奇怪的行为.这是一个简单的应用程序,它显示四个视图(CardView),每次点击其中一个,视图将通过更改其边框来反映它(使用"选定"属性).问题是,当"Value"属性是一个字符串时,它不起作用.但是,当"Value"属性的类型为Int时,它确实可以工作.这种行为是由于什么原因造成的?
import SwiftUI
struct Deck {
var cards = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10].map {
// Card(value: $0)
Card(value: "\($0)")
}
}
struct Card: Identifiable {
let id = UUID()
// let value: Int // Using int value solves the problem...
let value: String // Using string value provokes card view not updated
var selected = false
}
extension Card: Equatable {
static func ==(lhs: Card, rhs: Card) -> Bool {
return lhs.id == rhs.id
}
}
final class TestVM: ObservableObject {
@Published var deck = Deck()
func toggleSelection(card: Card) {
let idx = deck.cards.firstIndex(of: card)!
deck.cards[idx].selected.toggle()
}
}
struct CardView: View {
@ObservedObject var testVM: TestVM
let card: Card
var body: some View {
Text("\(card.value)")
.frame(width: 40, height: 80)
.background {
Rectangle()
.stroke(card.selected ? .red : .black, lineWidth: 2)
}
.background(card.selected ? .red.opacity(0.2) : .gray.opacity(0.2))
.onTapGesture {
testVM.toggleSelection(card: card)
}
}
}
struct TestZStackView: View {
@StateObject var testVM = TestVM()
var body: some View {
HStack {
ForEach(testVM.deck.cards.prefix(4)) { card in
CardView(testVM: testVM, card: card)
}
}
}
}
struct TestZStackView_Previews: PreviewProvider {
static var previews: some View {
TestZStackView()
}
}