SwiftUI中已遵守Identifiable的Card在ForEach中被要求遵循Hashable的原因?
问题原因
该报错是Xcode 13版本的编译器已知推断缺陷导致:你定义的Card结构体已经正确遵守Identifiable协议,且id为符合要求的Int(默认实现Hashable),但由于Card是嵌套在泛型结构体MemoryGame<CardContent>内部的类型,编译器无法正确识别它的Identifiable协议遵循,错误匹配了要求集合元素本身遵守Hashable的ForEach初始化器,才抛出了不符合预期的错误。
解决方案
推荐使用改动最小的方案:
- 显式指定
ForEach的id参数为\.id,跳过编译器的协议自动识别流程,修改ContentView中的对应代码即可:
ForEach(viewModel.cards, id: \.id) { card in CardView(card) .aspectRatio(2/3, contentMode: .fit) }
如果希望保持写法简洁,也可以选择给Card补充协议遵循:
- 由于你的项目中
CardContent实际使用String类型(原生遵守Hashable),直接给Card结构体追加Hashable声明即可,编译器会自动合成对应实现:
struct Card : Identifiable, Hashable { var isFaceUp : Bool = true var isMatched : Bool = false var content : CardContent var id: Int }
如果需要保留泛型兼容性,可以改为条件遵循:
extension MemoryGame.Card: Hashable where CardContent: Hashable {}
内容的提问来源于stack exchange,提问作者Ter Maxima
相关产品推荐
相关产品推荐

