【问题标题】:Referencing initializer 'init(_:content:)' on 'ForEach' requires that 'Planet' conform to 'Identifiable'在 'ForEach' 上引用初始化程序 'init(_:content:)' 要求 'Planet' 符合 'Identifiable'
【发布时间】:2021-09-30 13:50:42
【问题描述】:

我目前正在构建这个 ios 应用程序,我似乎遇到了以下问题

Referencing initializer 'init(_:content:)' on 'ForEach' requires that 'Planet' conform to 'Identifiable'

这是我当前的代码:

//
//  OnboadingView.swift
//  Planets (iOS)
//
//  Created by Andres Haro on 9/28/21.
//

import SwiftUI

struct OnboadingView: View {
    // Porperties
    
    var planets: [Planet] = planetsData
    
    
    // Body
    var body: some View {
        TabView{
            ForEach(planets[0...5]){ item in
                PlanetCardView(planet: <#Planet#>)
        } // Loop
    } // Tab
        
        .tabViewStyle(PageTabViewStyle())
        .padding(.vertical, 20)
    }
}

// Preview

struct OnboadingView_Previews: PreviewProvider {
    static var previews: some View {
        OnboadingView(planets: planetsData)
    }
}


有谁知道我应该对我的代码进行哪些更改,以及如果我使用来自正确变量的正确引用,为什么会出现这个问题?

【问题讨论】:

  • "...要求 'Planet' 符合 'Identifiable'",这是您需要修复或更改 ForEach 调用以包含 id: 参数
  • &lt;#Planet#&gt; 无论如何都是错误的,它是一个占位符。将其替换为item

标签: ios swift list swiftui


【解决方案1】:

ForEach 需要识别其内容以执行布局、成功将手势委托给子视图和其他任务。识别内容意味着ForEach 可以使用一些变量(它本身需要符合Hashable)。在大多数情况下,这就像使您的结构 (Planet) 符合 Identifiable 协议一样简单。您没有提供 Planets 结构的实现细节,但这是我可以想到的一种方法:

struct Planet: Identifiable {
    var id: String {
        self.name
    }
    var name: String
}

在此示例中,我假设行星的名称唯一标识它。完成此任务的常用方法是

  • 使用UUID 作为标识符
  • 为每个新实例分配不同的整数(或使用静态工厂)
  • 使用其他 Hashable 唯一变量。

如果您不想使您的结构符合Identifiable,您还可以提供您希望将其标识为键路径的变量:

struct PlanetView: View {
    let planets: [Planet]

    var body: some View {
        ForEach(planets, id: \.name) { planet in
            //...
        }
    }
}

【讨论】:

  • 谢谢,我忘记在我的结构中添加 Identifiable 标签。你是摇滚明星,我解决了我的问题。祝你有美好的一天!
猜你喜欢
  • 2020-07-20
  • 2020-01-23
  • 1970-01-01
  • 1970-01-01
  • 2021-06-21
  • 1970-01-01
  • 2019-11-07
  • 2017-10-26
  • 1970-01-01
相关资源
最近更新 更多