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())
但是我仍然会说这是一个微不足道的解决方案
答案 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)