SwiftUI未更新子视图中的ObservedObject

SwiftUI未更新子视图中的ObservedObject,swift,swiftui,Swift,Swiftui,所以我试着从斯坦福CS193p学习SwiftUI。这很有效,但是,我无法理解为什么这不起作用。我与讲师的观点完全相同: 结构ContentView:View{ @观察对象变量视图模型:EmojiMemoryGame var body:一些观点{ HStack{ ForEachself.viewModel.cards{card in CardViewcard:card.ontaps{ self.viewModel.chooseCardcard:card } } .aspectRatio2/3,内容

所以我试着从斯坦福CS193p学习SwiftUI。这很有效,但是,我无法理解为什么这不起作用。我与讲师的观点完全相同:

结构ContentView:View{ @观察对象变量视图模型:EmojiMemoryGame var body:一些观点{ HStack{ ForEachself.viewModel.cards{card in CardViewcard:card.ontaps{ self.viewModel.chooseCardcard:card } } .aspectRatio2/3,内容模式:。适合 } .橙色 衬料 .fontviewModel.numberOfPairsOfCards>=5?.callout:.LarGetTitle } } 结构卡视图:视图{ 变量卡:MemoryGame.card var body:一些观点{ VStack{ ZStack{ 如果card.isFaceUp{ RoundedRectanglecornerRadius:10.0.fillColor.white 圆角直角角半径:10.0。频闪线宽度:3 Textcard.content }否则{ RoundedRectanglecornerRadius:10.0.fillColor.orange } } } } } 问题在于,这不会更新视图,就好像模型中发布的信息不会传递到层次结构中一样。我知道它是有效的,因为如果我将代码更改为:

结构ContentView:View{ @观察对象变量视图模型:EmojiMemoryGame var body:一些观点{ HStack{ ForEachself.viewModel.cards{card in ZStack{ 如果card.isFaceUp{ RoundedRectanglecornerRadius:10.0.fillColor.white 圆角直角角半径:10.0。频闪线宽度:3 Textcard.content }否则{ RoundedRectanglecornerRadius:10.0.fillColor.orange } } .ontapsigne{ self.viewModel.chooseCardcard:card } } .aspectRatio2/3,内容模式:。适合 } .橙色 衬料 .fontviewModel.numberOfPairsOfCards>=5?.callout:.LarGetTitle } } 一切都很好。 非常感谢您的帮助

类emojiMemoryName:ObservableObject{ @已发布的私有var游戏:MemoryGame=EmojiMemoryGame.createMemoryGame 静态私有函数createMemoryGame->MemoryGame{
让emojis=[在您的卡结构中实现相等运算符只比较ID。不会更新CardView,因为SwiftUI推断卡没有更改

请注意,您可能需要检查卡的其他属性以及CardContent是否需要符合Equatable

struct Card: Identifiable, Equatable {

        static func == (lhs: MemoryGame<CardContent>.Card, rhs: MemoryGame<CardContent>.Card) -> Bool {
            return lhs.id == rhs.id && lhs.isFaceUp == rhs.isFaceUp
        }

        var isFaceUp = true
        var isMatched = false
        var content: CardContent
        var id: Int

    }

提供的代码快照不可测试。是否提供缺少的部分?添加了EmojiMemoryGame和MemoryGame。问题似乎出现在卡模型中。具有相同“id”但面不同的卡根据==运算符相等,因此不会更新。如果我更新比较函数以包含“isFaceUp”,则代码看起来很有效。