【问题标题】:Unable to run function with arguments in Swift无法在 Swift 中运行带参数的函数
【发布时间】:2021-01-27 14:03:11
【问题描述】:

我一直试图在 swift 中为我的应用程序创建一个菜单项,并通过按菜单上的不同按钮来运行不同的 python 脚本。我对 Swift 很陌生,我猜这里缺少一个简单的机制。

现在的问题是我正在尝试创建一个按钮,按下它时会运行一个动作。 函数调用位于 Toolbar 中,而 Toolbar 本身位于 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 中的两个值,这可能吗?就像使用字典并使用名称作为键和值作为路径一样。或者你有什么更好的方法来解决这个问题?

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

【问题讨论】:

    标签: swift compiler-errors swiftui


    【解决方案1】:

    问题是您正在执行函数myFunc,在它后面加上括号,这将产生Void 值,而不是() -> Void 类型的函数,这是Button 初始化程序所期望的。

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

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

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

    【讨论】:

      【解决方案2】:

      Button 视图的action 参数需要() -> Void 类型的参数。这意味着您需要传递对不带参数且不返回任何内容的函数/闭包的引用。

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

      Button("Label", action: myFunc)
      

      它起作用了,因为它不是调用myFunc,而是简单地引用它。如果你想用参数调用myFunc,你可以将它包装在一个闭包中,如下所示:

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

      这样,闭包不接受任何参数,也不返回任何内容,匹配所需的类型。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-02-01
        • 2014-09-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-07-12
        • 2018-12-28
        相关资源
        最近更新 更多