Возможно ли выполнить итерацию словаря внутри ForEach в SwiftUI?

#swift #foreach #swiftui

#swift #foreach #swiftui

Вопрос:

Я пытаюсь выполнить итерацию словаря @Published из ViewModel в представлении в SwiftUI. Я получаю сообщение об ошибке, в котором говорится, что:

Инициализатор ‘init(_:id:content:)’ требует, чтобы ‘Dictionary<Домен интересов, Bool>.Ключи’ соответствуют ‘RandomAccessCollection’

Как я могу выполнить итерацию словаря внутри ForEach? это мой код:

 ForEach(viewModel.userDomains.keys.indices, id: .self) { index in
    VStack {
        DomainOfInterestElement(isActive: self.$isActive, domain: self.viewModel.userDomains.keys[index].name)
        if index != self.viewModel.domains.count - 1 {
            Divider().padding(.bottom, 12)
        }
    }
}.padding([.trailing, .leading], 12)
  

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

1. Возможно, ваша модель представления должна вместо этого предоставлять массив.

Ответ №1:

Это потому, что словарь неупорядочен. Таким образом, его ключи также неупорядочены.

Вам нужно упорядочить его с помощью Array :

 ForEach(Array(viewModel.userDomains.keys).indices, id: .self) { ...
  

Поскольку они упорядочены случайным образом, вы также можете захотеть их отсортировать:

 ForEach(Array(viewModel.userDomains.keys).sorted().indices, id: .self) { ...
  

Но поскольку порядок и сортировка становятся более сложными, вы можете подумать о перемещении логики в ViewModel вместо этого.