gpt4 book ai didi

ios - 我可以在 ForEach 中使用协议(protocol)数组吗?

转载 作者:行者123 更新时间:2023-12-05 09:36:50 24 4
gpt4 key购买 nike

我有一个包含两个实现它的类的协议(protocol):

protocol GalleryItem {
func toView() -> AnyView
}

extension Class1:GalleryItem {
func toView() -> AnyView {
...
}
}

extension Class2:GalleryItem {
func toView() -> AnyView {
...
}
}

数组:

var array:[GalleryItem] = [Class1(), Class2()]

现在,如果我尝试在 ForEach 中使用该数组:

ForEach(array, id: \.self) { item in
item.toView()
}

我收到这个错误:

Value of protocol type 'GalleryItem' cannot conform to 'Hashable'; only struct/enum/class types can conform to protocols

这是否意味着我不能将这样的协议(protocol)数组传递给 ForEach?我还能如何实现这一点?

最佳答案

好的,让我们开始吧。

问题

在你的例子中,编译器期望参数 \.selfHashable 并且这个参数是你的协议(protocol) GalleryItem 的一个对象。

解决方案

为了解决这个问题,我们可以在协议(protocol)中增加一个要求,可以提供一个\.id。例如:

protocol GalleryItem {
func toView() -> AnyView
var id: Int { get } // could be any `Hashable` type
}

然后,我们可以使用 \.id 作为标识符,而不是在 ForEach 中使用 \.self 作为标识符:

ForEach(items, id: \.id) { item in
item.toView()
}

此处的命名和类型完全取决于您。以\.idInt 为例

关于ios - 我可以在 ForEach 中使用协议(protocol)数组吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64903129/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com