SwiftUI通用组件无法为CustomStringConvertible推断Hashable遵循问题
问题原因
你的泛型约束写法存在错误,导致实际效果和预期不符:
Test<ItemType: CustomStringConvertible, Hashable>这种写法实际是声明了两个独立的泛型参数:第一个参数名为ItemType,仅遵循CustomStringConvertible协议;第二个参数名为Hashable,无任何约束,完全不是你想要的「ItemType同时遵循两个协议」的效果。- 你使用
ForEach(items, id: \.self)的写法要求遍历的元素必须遵循Hashable协议,但你声明的ItemType并没有符合这个要求,所以编译器抛出ForEach要求ItemType遵循Hashable的错误。 - 第二个泛型参数
Hashable没有被任何属性或方法使用,编译器无法推断它的具体类型,因此抛出第二个推断失败的错误。
修复方案
将泛型约束改为用&连接多个协议,表示ItemType需要同时遵循两个协议即可:
public struct Test<ItemType: CustomStringConvertible & Hashable>: View { var items: [ItemType] public var body: some View { ForEach(items, id: \.self) { item in // 你也可以直接用item.description输出内容,用到CustomStringConvertible的能力 Text(item.description) } } } let items: [String] = ["a", "b"] let viewController = UIHostingController(rootView: Test(items: items))
如果你不想强制要求ItemType遵循Hashable,也可以调整ForEach的id参数,改用元素其他唯一的Hashable属性作为id,不需要绑定到元素本身。
内容的提问来源于stack exchange,提问作者WishIHadThreeGuns
相关产品推荐
相关产品推荐

