Как я могу использовать RandomAccessCollection со списком ForEach?
У меня есть класс, который выглядит примерно так:
public class TransactionResults: Identifiable {
public typealias CustomClassValue = Transaction
public typealias CustomClassIndex = Array<CustomClassValue>.Index
public let id = UUID()
private let transactions = sampleTransactions
}
extension TransactionResults: RandomAccessCollection {
public var startIndex: CustomClassIndex { return transactions.startIndex }
public var endIndex: CustomClassIndex { return transactions.endIndex }
public subscript(index: CustomClassIndex) -> CustomClassValue? {
get { if index >= 0 && index < transactions.count {
return transactions[index]
} else {
return nil
}
}
}
}
Когда я пытаюсь использовать его с ForEach, я получаю сообщение об ошибке: Cannot convert value of type 'TransactionResults' to expected argument type 'Range<Int>'
struct TransactionListView: View {
@State private var transactions = TransactionResults()
var body: some View {
NavigationView {
List() {
ForEach(transactions) { transaction in
EmptyView()
}
}
}
}
}
Что мне нужно изменить в моем классе TransactionResults, чтобы это работало правильно?
1 ответ
Решение
Если правильно заявить Transaction
class (который, кстати, может конфликтовать с SwiftUI Transaction
type, поэтому я бы рекомендовал переименовать ваш тип), тогда все, что необходимо (по крайней мере, как проверено с Xcode 11.4), - это использовать разные ForEach
конструктор:
ForEach(transactions, id: \.self) { transaction in
EmptyView()
}
Обновление: вот класс транзакции, с которым я тестировал снимок вашего кода (как я уже упоминал, я переименовал его, чтобы избежать конфликта со встроенным типом)
class ATransaction: Equatable, Identifiable, Hashable {
static func == (lhs: ATransaction, rhs: ATransaction) -> Bool {
lhs.id == rhs.id
}
func hash(into hasher: inout Hasher) {
hasher.combine(id)
}
let id = UUID()
}