如何使用自定义初始化程序扩展Picker?

时间:2020-07-25 05:26:53

标签: swift swiftui

我正在尝试使以下代码起作用:

extension Picker where Label == Text, SelectionValue == Bool {
    init(selection: Binding<SelectionValue>) {
        self.init("Bool", selection: selection) {
            Text("TRUE").tag(true)
            Text("FALSE").tag(false)
        }
    }
}

但是出现此编译器错误:

无法将类型“ TupleView <(某些视图,某些视图)>”的值转换为闭合结果类型“内容”

目标是能够通过以下方式创建选择器:

@State private var value = false

var body: some View {
    Form {
        Picker($value)
    }
}

我了解编译器会尝试从初始值设定项的调用者推断Content,但是由于我正在调用现有的初始值设定项并为其提供内容,为什么我仍然会看到此错误?

1 个答案:

答案 0 :(得分:1)

您指定了Label的{​​{1}}和SelectedValue类型应该在扩展头中,而不是Picker,因此此初始化程序将与所有各种内容类型。但是您真的不想要那个吗?该初始化程序仅产生具有以下特定类型的Content的选择器:

Content

但是我们不能真正命名它的类型,因为它是{ Text("TRUE").tag(true) Text("FALSE").tag(false) } ,并且不能像这样使用不透明类型:

TupleView<(some View, some View)>

解决此问题的一种方法是将// nope! extension Picker where Label == Text, SelectionValue == Bool, Content == TupleView<(some View, some View)> { s包装在Text s中:

AnyView