无法在 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

SwiftUI:列表错误无法调用非函数类型'Binding<Subject>'的值

SwiftUI 错误:无法转换“UIImage”类型的值?关闭结果类型“无效”