如何在Swift 3中将函数设置为函数参数

时间:2016-11-07 14:41:16

标签: swift

Q :是否可以在Swift 3中将函数作为函数参数传递?

要重构我的代码,我希望拥有一个全局函数。在此函数的末尾,有一个自定义按钮,其中包含action参数。

let deleteButton = MIAlertController.Button(title: "cancel", 
                                            type: .cancel, 
                                            config: getDestructiveButtonConfig(),
                                            action: {
                                                print("completed")
                                            })

我想做的是设置一个函数作为参数的全局函数。

MyGlobalStuff.swift
...
func getButton(_ myFunc: func, _ title: String) {
    let deleteButton = MIAlertController.Button(title: title, 
                                            type: .cancel, 
                                            config: getDestructiveButtonConfig(),
                                            action: {
                                                myFunc // call here the function pass by argument
                                            })
}

getButton(..)调用同一类中传递的函数。

MyViewController.swift
...
getButton(myPrintFunc, "cancel")

func myPrintFunc() {
        print("completed")
}

这样的事情可能吗?非常感谢帮助。

3 个答案:

答案 0 :(得分:11)

是的,您可以将函数/闭包作为另一个函数的参数传递。

这是语法

RichFunction

这里函数func doSomething(closure: () -> ()) { closure() } 作为参数接收一个没有参数且没有返回类型的闭包。

您可以使用此语法调用doSomething

doSomething

或使用尾随闭包语法

doSomething(closure: { _ in print("Hello world") })

答案 1 :(得分:10)

假设

typealias Func = () -> Void    

你可以这样做:

func getButton(_ title: String, _ myFunc: Func) {
    let deleteButton = MIAlertController.Button(title: title, 
                                                type: .cancel, 
                                                config: getDestructiveButtonConfig(),
                                                action: {
                                                    myFunc()
                                                })
}

甚至:

func getButton(_ title: String, _ myFunc: Func) {
    let deleteButton = MIAlertController.Button(title: title, 
                                                type: .cancel, 
                                                config: getDestructiveButtonConfig(),
                                                action: myFunc
                                                )
}

另外,如果你没有注意到,我将闭包移到了参数列表的末尾。通过这种方式,它将允许高级魔法,如:

getButton("X") { … }

而不是

getButton({ … }, "X")

答案 2 :(得分:4)

函数是swift中的第一类,所以你可以像这样传递它们:

func getButton(_ myFunc: () -> Void, _ title: String) {

您需要在类型中指定函数的签名,即参数类型和返回类型