You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.29 11:06:07