Generi c параметр SelectionValue не может быть выведен - PullRequest
0 голосов
/ 14 июля 2020

Вероятно, я чего-то упускаю, но почему это работает для средства выбора, но не для списка? Я не понимаю, почему он жалуется на отсутствующий тип параметра.

struct ContentView: View {
enum FooBar: CaseIterable, Identifiable {
    public var id : String { UUID().uuidString }
    
    case foo
    case bar
    case buzz
    case bizz
}

@State var selectedFooBar: FooBar = .bar

var body: some View {
    VStack {
        Picker("Select", selection: $selectedFooBar) {
            ForEach(FooBar.allCases) { item in
                Text(self.string(from: item)).tag(item)
            }
        }
        
        List(FooBar.allCases, selection: $selectedFooBar) { item in
            Text(self.string(from: item)).tag(item)
        }
        
        Text("You selected: \(self.string(from: selectedFooBar))")
    }
}


private func string(from item: FooBar) -> String {
    var str = ""
    
    switch item {
    case .foo:
        str = "Foo"
        
    case .bar:
        str = "Bar"
        
    case .buzz:
        str = "Buzz"
        
    case .bizz:
        str = "Bizz"
    }
    return str
}
}

Я пытался найти объяснения и примеры, но ничего не нашел.

Ответы [ 2 ]

0 голосов
/ 14 июля 2020

Если вы извлекаете список в его собственную переменную за пределами body:

var list: some View {
        List(FooBar.allCases, selection: $selectedFooBar) { item in
            Text(self.string(from: item)).tag(item)
        }
    }

... Вы получаете следующую ошибку: «Невозможно вызвать инициализатор для типа 'List <_, _>' со списком аргументов типа '([ContentView.FooBar], selection: Binding , @escaping (ContentView.FooBar) -> some View) '"

Похоже, вы пытаетесь использовать тот же инициализатор из Picker on List, но они совсем другие. Может быть, это то, что вы' ищу:

List {
            ForEach(FooBar.allCases) { item in
                Text(self.string(from: item)).tag(item)
            }
        }
0 голосов
/ 14 июля 2020

Выбранный элемент имеет правильный тип FooBar для средства выбора, но неправильный тип для списка. если вы использовали Set<String>, компилятор не будет жаловаться

@State var selectedFooBar: FooBar = .bar
@State var selectedItems: Set<String>

var body: some View {
    VStack {
        Picker("Select", selection: $selectedFooBar) {
            ForEach(FooBar.allCases) { item in
                Text(self.string1(from: item)).tag(item)
            }
        }

        List(FooBar.allCases, selection: $selectedItems) { item in
            Text(self.string1(from: item))
        }



        Text("You selected: \(self.string1(from: selectedFooBar))")
    } 

Обратите внимание, что список должен быть в «режиме редактирования», чтобы использовать выбор.

...