是否可以在Swift中将函数作为另一个函数的参数调用?

时间:2015-11-11 12:49:51

标签: swift swift2

是否可以在Swift ??

中将函数作为另一个函数的参数调用

我在Swift制作一个声音效果应用,它使用不同的效果,如AVAudioUnitReverb()AVAudioUnitDistortion()等。我想创建一个单一的功能,只能调用哪些效果我想做。

3 个答案:

答案 0 :(得分:5)

因为在Swift函数中 第一类 ,所以可以将它作为参数传递给另一个函数。

示例:

func testA() {
    print("Test A")
}

func testB(function: () -> Void) {
    function()
}

testB(testA)

答案 1 :(得分:1)

您可以将函数作为参数传入我输入具有相同签名的参数。

正如sun的例子只是处理Void参数和返回类型,我想添加另一个例子

func plus(x:Int, y:Int) -> Int {
    return x + y
}

func minus(x:Int, y:Int) -> Int {
    return x - y
}

func performOperation (x:Int, _ y:Int, op:(x:Int,y: Int) -> Int) -> Int {
    return op(x: x, y: y)
}

let resultplus = performOperation(1, 2, op: plus) // -> 3
let resultminus = performOperation(1, 2, op: minus) // -> -1

note :当然您应该考虑动态类型参数。为简单起见,这里只是Ints

这被称为高阶函数,在许多语言中,这就是这样做的方式。但是,你通常不会为它明确创建函数。这里的闭包是一个完美的工具:

函数performOperation保持不变,但操作的实现方式不同:

let plus = { (x:Int, y:Int) -> Int in
    return x + y
}

let minus = { (x:Int, y:Int) -> Int in
    return x - y
}

let resultplus = performOperation(1, 2, op: plus)
let resultminus = performOperation(1, 2, op: minus)

这通常是首选,因为它不需要将方法添加到类中,就像其他语言中的匿名函数一样。

更多相关内容以及如何在swift标准库中使用它:https://www.weheartswift.com/higher-order-functions-map-filter-reduce-and-more/

答案 2 :(得分:1)

我建议使用Matt Neuburg的书“IOS 9 Programming Fundamentals with Swift”,特别是章节“功能”。

您不仅应该找到问题的答案:

func imageOfSize(size:CGSize, _ whatToDraw:() -> ()) -> UIImage {
   ...
}

但是如何构造返回函数的函数:

func makeRoundedRectangleMaker(sz:CGSize) -> () -> UIImage { 
   ...
}

以及Curried Functions的简要介绍。