#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-это тип значения, а не ссылочный тип, как класс