Тип аргумента Swift «XXX», как ожидается, будет экземпляром класса или типа с ограничением класса

#ios #swift #swiftui

Вопрос:

Я очень новичок в Swift amp; SwiftUI. Я пытаюсь установить идентификатор для просмотра в ScrollView, чтобы затем использовать ScrollViewReader для прокрутки до верхней позиции(первый элемент).То, с чем я борюсь, — это когда я пытаюсь получить индекс массива, я получаю тип аргумента ошибки «XXX», который должен быть экземпляром класса или типа с ограничением класса. Как я могу решить эту проблему? тнх

введите описание изображения здесь

 import SwiftUI

struct PokedexListView: View {
    let pokemons: [Pokemon]
    let hasMoreData: Bool
    
    var fetchListener: () -> Void
    
    var body: some View {
        NavigationView {
            ScrollViewReader { scrollView in
                ScrollView {
                    LazyVStack {
                        ForEach (pokemons) { pokemon in
                            PokemonCellView(pokemon: pokemon)
                                .id(self.getID(pokemon: pokemon))
                        }
                        if hasMoreData {
                            LoadingFooterView()
                                .onAppear { fetchListener() }
                        }
                    }
                }
                .overlay(
                    ScrollTopBtnView(toTop: { scrollView.scrollTo(0) })
                        .padding(.trailing)
                        .padding(.bottom, 80),
                    alignment: .bottomTrailing
                )
                .navigationTitle("Pokedex")
            }
        }
    }
    
    func getID(pokemon: Pokemon) -> Int {
        return pokemons.firstIndex { p in p === pokemon  } ?? -1
    }
}

 

Ответ №1:

Заменить === на ==

 return pokemens.firstIndex { p in p.id == pokemon.id  } ?? -1  
 

=== используется для сравнения объектов , не являющихся примитивными/структурными типами данных, или для того, чтобы pokemon тип a class не struct

Комментарии:

1. Привет @Sh_Khan thx за ваш ответ. Я обнаружил, что когда я переключаюсь на приведенный ниже код, все идет нормально, так что просто любопытно, могу ли я сравнить два объекта в Swift ? return pokemons.firstIndex { p in p.id == pokemon.id } ?? -1

2. == также использоваться для сравнения объектов/экземпляров за равноправие, как в такой же, как Б. Иногда может быть необходимым, чтобы сравнить объекты, чтобы увидеть, если они не только равными,/эквивалент, но являются, по сути, точно такой же объект , как в «в разные инстанции, чтобы хотя б они одинаковые», то вы используете указатель на равенство ===

3. Все еще не совсем понимаю, почему я не мог сравнить два объекта. Или в swift данные структуры не являются объектом ? Потому что, когда я использую приведенный ниже код, он показывает эту ошибку, ссылающуюся на функцию оператора «= = » в «Равнозначном», требует, чтобы «Покемон» соответствовал «Равнозначному» . return pokemons.firstIndex { $0 == pokemon } ?? -1

4. @Jung struct-это тип значения, а не ссылочный тип, как класс