#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
вместо этого.