Как я могу использовать RandomAccessCollection со списком ForEach? - PullRequest
1 голос
/ 27 мая 2020

У меня есть класс, который выглядит примерно так:

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()
                }
            }
        }
    }
}

What мне нужно изменить свой класс TransactionResults, чтобы это работало правильно?

1 Ответ

1 голос
/ 27 мая 2020

Если вы правильно объявите свой класс Transaction (который, кстати, может конфликтовать с типом SwiftUI Transaction, поэтому я бы рекомендовал переименовать ваш тип), тогда все необходимо (по крайней мере, как проверено с 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()
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...