TL; DR
Ваша переменная currencyCode
не соответствует типу идентификатора для каждого элемента в вашем ForEach
.Либо переберите коды в вашем ForEach
, либо передайте свой Picker
индекс.
Ниже приведены три эквивалентных примера.Обратите внимание, что переменная @State
, которая передается в Picker
, всегда совпадает с идентификатором элемента, по которому ForEach
повторяется:
Также обратите внимание, что я выбрал значение по умолчанию для переменной @State
, котораяотсутствует в массиве ("", -1, UUID ()), поэтому при загрузке формы ничего не отображается.Если вы хотите использовать опцию по умолчанию, просто сделайте ее значением по умолчанию для вашей переменной @State
.
Пример 1. Перебор кодов (т. Е. Строк)
struct ContentView: View {
@State private var currencyCode: String = ""
var codes: [String] = ["EUR", "GBP", "USD"]
var body: some View {
NavigationView {
Form {
Section {
Picker(selection: $currencyCode, label: Text("Currency")) {
// ID is a String ----v
ForEach(codes, id: \.self) { (string: String) in
Text(string)
}
}
}
}
}
}
}
Пример 2. Итерация по индексам (т. Е. Int)
struct ContentView: View {
@State private var selectedIndex: Int = -1
var codes: [String] = ["EUR", "GBP", "USD"]
var body: some View {
NavigationView {
Form {
Section {
Picker(selection: $selectedIndex, label: Text("Currency")) {
// ID is an Int --------------v
ForEach(codes.indices, id: \.self) { (index: Int) in
Text(self.codes[index])
}
}
}
}
}
}
}
Пример 3. Итерация по идентифицируемой структуре по ее типу идентификатора (т. Е. UUID)
struct Code: Identifiable {
var id = UUID()
var value: String
init(_ value: String) {
self.value = value
}
}
struct ContentView: View {
@State private var selectedUUID = UUID()
var codes = [Code("EUR"), Code("GBP"), Code("USD")]
var body: some View {
NavigationView {
Form {
Section {
Picker(selection: $selectedUUID, label: Text("Currency")) {
// ID is a UUID, because Code conforms to Identifiable
ForEach(self.codes) { (code: Code) in
Text(code.value)
}
}
}
}
}
}
}