#ios #swift #list #swiftui
Вопрос:
В настоящее время я создаю это приложение для 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)
}
}
Кто-нибудь знает, что я должен изменить в своем коде и почему у меня возникает эта проблема, если я использую правильную ссылку из правильной переменной?
Комментарии:
1. «…требуется, чтобы «Планета» соответствовала «Идентифицируемому»», это то, что вам нужно исправить или изменить вызов ForEach, чтобы также включить
id:
аргумент2.
<#Planet#>
в любом случае это неправильно, это заполнитель. Замените его наitem
.
Ответ №1:
ForEach
необходимо определить его содержимое, чтобы выполнить компоновку, успешно делегировать жесты дочерним представлениям и другим задачам. Идентификация содержимого означает, что должна быть какая-то переменная (которая сама должна соответствовать Hashable
), которую ForEach
можно использовать. В большинстве случаев это так же просто, как привести вашу структуру ( 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
//...
}
}
}
Комментарии:
1. Спасибо, я забыл добавить Идентифицируемый тег внутри моей структуры. Ты рок-звезда, я решил свою проблему. Хорошего вам дня!