如何从 SwiftUI 中的函数 return 一个按钮?

How to return a Button from a function in SwiftUI?

我需要根据一些参数动态创建一个Button

func buildButton(parameter : Parameter) -> Button {
        switch (parameter){
            case Parameter.Value1:
                return Button(
                    action: {
                        ...
                },
                    label: {
                        ...
                }
            )
            case Parameter.Value2:
                return Button(
                    action: {...},
                    label: {
                        ...
                }
            )
        }
    }

但是编译器给我这个错误:

Reference to generic type 'Button' requires arguments in <...>. Insert '<<#Label: View#>>'

所以如果我点击Fix,函数声明就变成了

func buildButton(parameter : Parameter) -> Button<Label:View>

并且编译器给出

Use of undeclared type '<#Label: View#>'

我需要在此处插入什么才能return一个Button

如果您查看 Button 的声明,您会发现它是一个泛型 struct,因此您需要提供其泛型类型参数。

struct Button<Label> where Label : View

确保将 YourView 替换为您想要 return 实现 View 的实际类型。

class YourView: View { ... }

func buildButton(parameter : Parameter) -> Button<YourView> {
    switch (parameter){
        case Parameter.Value1:
            return Button(
                action: {
                    ...
            },
                label: {
                    ...
            }
        )
        case Parameter.Value2:
            return Button(
                action: {...},
                label: {
                    ...
            }
        )
    }
}

我不确定你得到一个 Button 有多重要,但如果你只需要它在另一个 SwiftUI View 中显示而不需要进一步细化,你可以 return some View .您只需将所有按钮嵌入到 AnyView 中即可。

func buildButton(parameter : Parameter) -> some View {
        switch (parameter){
            case Parameter.Value1:
                return AnyView(Button(
                    action: {
                        ...
                },
                    label: {
                        ...
                })
            )
            case Parameter.Value2:
                return AnyView(Button(
                    action: {...},
                    label: {
                        ...
                })
            )
        }
    }