Средство выбора SwiftUI, управляемое перечислением: значение не обновлено

Согласно документации Apple относительно Picker в SwiftUI с использованием Enum, если перечисление соответствует Identifiable протокол в дополнение к CaseIterable, средство выбора, перебирающее все случаи, должно обновлять связанную переменную изначально.

Я протестировал его, и он не работает должным образом.

       enum Flavor: String, CaseIterable, Identifiable {
    case chocolate
    case vanilla
    case strawberry

    var id: String { self.rawValue }
}

struct EnumView: View {
    @State private var selectedFlavor = Flavor.chocolate
    var body: some View {
        VStack {
            Picker("Flavor", selection: $selectedFlavor) {
                ForEach(Flavor.allCases) { flavor in
                    Text(flavor.rawValue.capitalized)//.tag(flavor)
                }
            }
        
            Text("Selected flavor: \(selectedFlavor.rawValue)")
        }
    }
}

Однако, если я прохожу tag для каждого вида это работает.

Что тут происходит? Документация Apple неверна? В selectedFlavor переменная ожидает значение типа Flavor, но идентификатор, используемый в сборщике, на самом деле String.

Благодарю.

2 ответа

Решение

Для Picker для правильной работы необходимо определить его элементы.

Обратите внимание, что selectedFlavor переменная имеет тип Flavor. Это означает, что параметры в средстве выбора должны быть обозначены как "Ароматизаторы" (а не "Строки").

Однако в вашем коде ваш id относится к типу String:

var id: String { self.rawValue }

Вы также можете:

  • обеспечить tag (типа Flavor):
Text(flavor.rawValue.capitalized)
    .tag(flavor)
  • соответствовать Flavor к Identifiable путем предоставления индивидуального id типа Flavor:
var id: Flavor { self }
  • указать id параметр (типа Flavor) явно в ForEach:
ForEach(Flavor.allCases, id: \.self) { ... }
  • изменить selectedFlavor быть строкой:
@State private var selectedFlavor = Flavor.chocolate.rawValue

Это дополнение к уже классному ответу @pawello2222.

Просто чтобы уточнить, что решение для соответствия перечисления Идентифицируемому с использованием приведенного ниже кода работает для правильной маркировки средства выбора пользовательского интерфейса без явного объявления его в коде средства выбора:

      var id: Flavor { self }

Официальная документация Apple для средства выбора swiftUI говорит, что для идентификации перечисления используется var id: String { self.rawValue }и не работает должным образом, используя остальную часть кода примера.

Другие вопросы по тегам