无法在 SwiftUI 中将“UUID”类型的值转换为预期的参数类型“KeyPath<Item, ID>”
Posted
技术标签:
【中文标题】无法在 SwiftUI 中将“UUID”类型的值转换为预期的参数类型“KeyPath<Item, ID>”【英文标题】:Cannot convert value of type 'UUID' to expected argument type 'KeyPath<Item, ID>' in SwiftUI 【发布时间】:2020-07-05 12:53:05 【问题描述】:我正在 SwiftUI 中实现我自己的自定义网格。我正在使用泛型以网格方式布置给定项目的数组。我希望它们具有动画效果,因此我需要在 Grid 实现中为 ForEach 指定一个 id。由于项目是泛型,如何指定 id。
我想使用 UUID 却出现以下错误
无法将“UUID”类型的值转换为预期的参数类型 'KeyPath'
另外,我尝试了id: \.self
- 我收到以下错误:
通用结构 'ForEach' 要求 'Item' 符合 'Hashable'
这是我的网格代码:
struct Grid<Item, ItemView> : View where Item : Identifiable, ItemView : View
private var items : Array<Item>
private var viewForItem : (Item) -> ItemView
init(_ items: Array<Item>, viewForItem: @escaping (Item) -> ItemView)
self.items = items
self.viewForItem = viewForItem
func getLayout(itemsCount: Int, size: CGSize) -> GridLayout
GridLayout(itemCount: itemsCount, in: size)
var body: some View
GeometryReader geometry in
ForEach(self.items, id: \.self) item in
self.viewForItem(item)
.frame(width: self.getLayout(itemsCount: self.items.count, size: geometry.size).itemSize.width,
height: self.getLayout(itemsCount: self.items.count, size: geometry.size).itemSize.height)
.position(self.getLayout(itemsCount: self.items.count, size: geometry.size)
.location(ofItemAt: self.items.firstIndex(of: item)!))
这是我的模型:
struct SetGame
var deck : Array<SetCard> = []
var playingTwelveDeck : Array<SetCard> = []
struct SetCard : Identifiable, Hashable
var color : ColorValue
var shapeName : ShapeName
var shading : Shadings
var count : Int
var isSelected = false
var isMatched = false
var position : Int
var isSelectedAnimationToggle : Bool
var id = UUID()
我在 Grid 中使用 SetGame.SetCard
作为我的项目。
【问题讨论】:
【参考方案1】:如果你想将Item
限制为Hashable
,你可以这样做:
struct Grid<Item, ItemView>: View
where Item: Identifiable & Hashable, // <- add `Hashable`
ItemView: View
...
【讨论】:
之后id应该是什么? \.self 或其他东西 这是 ForEach 区分项目的参数。它可以是一个特定的属性(例如,id: \.id
用于 Identifiable)也可以是整个项目(只要它符合 Hashable) - 然后您可以使用 id:\.self
。以上是关于无法在 SwiftUI 中将“UUID”类型的值转换为预期的参数类型“KeyPath<Item, ID>”的主要内容,如果未能解决你的问题,请参考以下文章
[C++]jsoncpp中将整个Json::Value转成std::string或者把里面值转成string类型
[C++]json cpp中将整个Json::Value转成std::string或者把里面值转成string类型
无法将 '[String : AnyObject]?.Type' 类型(又名 'Optional<Dictionary<String, AnyObject>>.Type)的值转
无法将“()”类型的值转换为预期的参数类型“(() -> Void)?”在 swiftui