如何将函数作为可选参数传递

时间:2018-11-20 11:05:09

标签: swift

Swift的新手,我现在可以通过以下方式传递函数作为可选参数:

import Foundation 

func foo()
{
    print("Foo")
}

func bar()
{
    print("Bar")
}

func dummy()
{
    return
}

func myFunc()
{
    myFunc(callBack: dummy())
}

func myFunc(callBack: (Void))
{
    foo()
    callBack
}

myFunc()
myFunc(callBack: bar())

即利用多态性

这似乎是一种微不足道的方法,有没有更好的方法,

谢谢, 汤姆

编辑:

我知道我可以通过以下操作来缩短此时间:

import Foundation 

func foo()
{
    print("Foo")
}

func bar()
{
    print("Bar")
}

func dummy()
{
    return
}

func myFunc(callBack: (Void) = dummy())
{
    foo()
    callBack
}

myFunc()
myFunc(callBack: bar())

但是我仍然会说这是一个微不足道的解决方案

4 个答案:

答案 0 :(得分:2)

您指的是default arguments

  

您可以为函数中的任何参数定义默认值,方法是在该参数类型之后为该参数分配一个值。如果定义了默认值,则可以在调用函数时省略该参数。

所以您需要类似的东西:

func myfunc (callback: ()->void = dummy) {

LinusGeffarth指出,在Swift中,回调称为 completion closure ,如avismara注释。

答案 1 :(得分:2)

您可以轻松地将函数的默认值定义为参数:

func foo(completion: () -> Void = { }) {
    completion()
}

您也可以默认将其设置为零:

func foo(completion: (() -> Void)? = nil) {

当它是一个可选的闭包时,您必须这样称呼它:

completion?()

答案 2 :(得分:1)

嗯,您是否将函数作为可选参数传递?好像您已经编写了一个接受Void的方法,您有一个接受Void的函数,而您只是在调用该方法。除了myFunc具有多个签名之外,我在这里看不到任何多态性痕迹。这种方法不是优雅的解决方案,不是因为它很优雅,而是因为它不是解决方案。

这是功能系统中多态的正确示例:

func printA() {
    print("A")
}

func printB() {
    print("B")
}

//This method accepts a function as a parameter
func higherOrderPrinter(with print: () -> Void ) { 
    print() //Can be anything, depends on the method you send here. Polymorphism much? :)
}

higherOrderPrinter(with: printA) //Prints A. See carefully how I am NOT doing printA()
higherOrderPrinter(with: printB) //Prints B
//In fact...
higherOrderPrinter {
    print("C") 
} //Prints C

答案 3 :(得分:1)

应用了答案的完整代码:

import Foundation 

func foo()
{
    print("Foo")
}

func bar()
{
    print("Bar")
}

func myFunc(completion: () -> Void = { })
{
    foo()
    completion()
}

myFunc()
myFunc(completion: bar)