David Seek David Seek - 1 month ago 7
Swift Question

How to set a function as function argument in Swift 3

Q: Is it possible to pass a function as function argument in Swift 3?

To refactor my code, I want to have a global function. At the end of this function, there is a custom button that has an

action
argument.

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


What I would like to do is something like, setting up a global function with a function as argument.

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
})
}


Called by
getButton(..)
with the passed function within the same Class.

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

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


Is something like that possible? Help is very appreciated.

Answer

Yes you can pass a function/closure as parameter of another function.

This is the syntax

func doSomething(closure: () -> ()) {
    closure()
}

here the function doSomething receives as parameter a closure with no params and no return type.

You can call doSomething with this syntax

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

Or using the trailing closure syntax

doSomething { 
    print("Hello world")
}