ios - 在 '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
可以使用。在大多数情况下,这就像让你的 struct( Planet
) 符合Identifiable
协议一样简单。您没有提供Planet
s 结构的实现细节,但这是我可以想到的一种方式来显示这一点:
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
//...
}
}
}
推荐阅读
- react-native - 解决 react-native 中损坏的“TextInput”组件的方法
- sql - sql sum 每天都有单独的列
- nginx - 具有自定义端口配置的 Nginx ssl 失败
- javascript - 无法从 expressJS 中的 post 方法接收有效负载
- swift - Swift/Xcode 标签栏徽章刷新
- elasticsearch - 在 ES 查询过滤器上使用 match_phrase 两次?没有为 [match_phrase] 注册过滤器
- c# - C# 重构代码以使泛型可重用
- r - lm.fit(x,y,offset = offset,singular.ok =singular.ok,...)中的错误:r 中的 0(非 NA)案例重复测量方差分析
- java - 如何通过 LWJGL 绘制立方体?
- python - 使用 JOIN 的混合属性表达式