Ссылка на инициализатор «init(_:content:)» в «ForEach» требует, чтобы «Планета» соответствовала «Идентифицируемому»

#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. Спасибо, я забыл добавить Идентифицируемый тег внутри моей структуры. Ты рок-звезда, я решил свою проблему. Хорошего вам дня!