在'ForEach'上引用初始值设定项'init(_:content:)'要求'Planet'符合'Identifiable'



我目前正在构建这个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)
}
}

有没有人知道我应该改变我的代码,为什么我得到这个问题,如果我使用正确的引用从正确的变量?

ForEach需要识别其内容,以便执行布局,成功地将手势委托给子视图和其他任务。确定内容意味着必须有一些变量(其本身需要符合Hashable)ForEach可以使用。在大多数情况下,这就像使结构体(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
//...
}
}
}

相关内容

最新更新