无法 运行 使用 Swift 中的参数运行

Unable to run function with arguments in Swift

我一直在尝试在 swift 中为我的应用程序创建一个菜单项,通过按菜单上的不同按钮,我想 运行 不同的 python 脚本。我是 Swift 的新手,我猜这里缺少一个简单的机制。

现在的问题是,我正在尝试创建一个按钮,按下时的动作为 运行。 函数调用在工具栏中,工具栏本身在 NavigationView 中:

ToolbarItem {
                    Menu {
                        Button("Label", action: myFunc("My string"))

                    } label: {
                        Label("Scripts", systemImage: "applescript")
                    }
                }

函数myFunc是这样的:

func myFunc(_ param: String) -> Void {
        print(param)
    }

(整数只是后面值的占位符,它对应于我正在尝试的脚本的路径运行)

错误是:

Cannot convert value of type 'Void' to expected argument type '() -> Void'

奇怪的是,当我在函数调用中排除参数时,比如调用 a:

func myFunc() {
   print("Hello")
}

在同一个位置,它工作得很好。按钮是否有限制,比如不能向它们的函数发送参数?

我看过不同的解决方案,但对于这个错误来说,它们似乎都太复杂了。我看到一个指南是因为视图是空的,但这似乎不是手边的错误。

按钮的数量稍后将在 ForEach 中。然而,对于存储脚本路径的最佳方式是什么,我有点矛盾。我一直在考虑使用不同的路径作为 rawValues 进行枚举。但是我想要按钮的标签与文件的实际路径不同,所以我需要将两个值存储在 rawValues 中,这可能吗?就像使用字典并将名称用作键并将值用作路径一样。或者您对解决此问题的更好方法有任何意见吗?

我非常愿意接受建议,目标只是能够 运行 脚本在菜单中包含按钮!

问题是您通过在函数 myFunc 后面加上括号来执行函数,这将导致 Void 值而不是 () -> Void 类型的函数,这Button 初始化程序期望。

您可以通过将函数调用包装在闭包中来解决此问题。

ToolbarItem {
    Menu {
        Button("Label", action: { myFunc("My string") })
    } label: {
        Label("Scripts", systemImage: "applescript")
    }
}

通过这种方式,您实际上是将 () -> Void 类型的闭包传递给 Button init(它期望的),它只会在点击按钮时执行。在您之前的实现中,该函数在 Button 初始化后立即执行,而不是在它被点击时执行。

Button 视图的 action 参数需要类型为 () -> Void 的参数。这意味着您需要传递对 function/closure 的引用,该引用不带参数且 returns 不带任何参数。

这就是为什么当您从 myFunc 中删除参数时(导致此按钮代码:

Button("Label", action: myFunc)

它起作用了,因为它不是调用 myFunc,而只是引用它。如果你想用一个参数调用 myFunc,你可以把它包装在一个闭包中,像这样:

Button("Label", action: { myFunc("My string") })

这样,闭包不带任何参数,returns什么也没有,匹配所需的类型。