admin管理员组文章数量:1199542
I have the following generic class which has a closure that allows for a tag to be added on a list's row:
struct ListView<T: MenuItem>: View
{
@Binding var items: [T]
var itemTag: ((T) -> AnyHashable)
var body: some View
{
ForEach(self.items)
{
item in Text(item.name).tag(self.itemTag(item))
}
}
}
But when I implement ListView
and call on the closure:
ListView(items: self.$secondaryItems, itemTag:
{
secondaryItem in
return AnyHashable(ListItem.secondaryItem(secondaryItem))
})
It isn't working (my selectable list refuses to select the item). But when I remove the AnyHashable
wrapper and change the return type in the declaration to ListItem
, it works fine. Does anyone know why this is? I want to avoid adding an additional type parameter to ListView to represent the tag type because I have static methods in ListView, such that every time I call them I have to include those type parameters i.e. ListView<>.insertItem(). it's making me do this because I'm using a ViewBuilder closure that takes in type T as a parameter. I don't like having to send in a dummy variable when I call these methods i.e. ListView<, Tag>.insertItem().
Complete code listed here:
enum ListItem: Hashable
{
case primaryItem
case secondaryItem(SecondaryItem)
}
protocol MenuItem: Equatable, Identifiable, PersistentModel
{
var name: String { get set }
}
@Model
class SecondaryItem: MenuItem
{
var name: String = ""
init(name: String)
{
self.name = name
}
}
struct HomeView: View
{
@State private var selectedListItem: ListItem?
@State private var secondaryItems: [SecondaryItem] = [SecondaryItem(name: "Secondary 1"), SecondaryItem(name: "Secondary 2")]
var body: some View
{
List (selection: self.$selectedListItem)
{
Text("Primary").tag(ListItem.primaryItem)
ListView(items: self.$secondaryItems, itemTag:
{
secondaryItem in
return AnyHashable(ListItem.secondaryItem(secondaryItem))
})
}
.onFirstAppear
{
self.selectedListItem = ListItem.primaryItem
}
}
}
struct ListView<T: MenuItem>: View
{
@Binding var items: [T]
var itemTag: ((T) -> AnyHashable)
var body: some View
{
ForEach(self.items)
{
item in Text(item.name).tag(self.itemTag(item))
}
}
}
本文标签: swiftWhy is AnyHashable not working as a return value for a closureStack Overflow
版权声明:本文标题:swift - Why is AnyHashable not working as a return value for a closure? - Stack Overflow 内容由网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:http://www.betaflare.com/web/1738548096a2096822.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论