2015-11-11 53 views
0

是否可以在Swift中調用函數作爲另一個函數的參數?是否可以在Swift中將函數作爲另一個函數的參數調用?

我在做一個Swift聲音效果的應用程序,它使用像AVAudioUnitReverb()AVAudioUnitDistortion()等等。我想創造一個單一的功能,只是能夠打電話我想做哪個效果不同的效果。

+0

您可以傳遞函數作爲函數的參數。您可以直接或通過名稱傳遞函數。 –

回答

5

由於夫特功能一流類型,可以把它作爲一個參數傳遞給另一功能。

例子:

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

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

testB(testA) 
1

您可以通過功能作爲參數我的打字具有相同簽名的參數。

隨着陽光的例子只是虛空涉及的參數和返回類型,我想補充另一個例子

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 

:當然,你應該考慮動態類型的參數。爲了簡單起見,這裏只是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) 

通常會是首選,因爲它並不需要方法被添加到一個類,非常像其他語言的匿名函數。


這個

越來越它是如何在迅速的標準庫使用:https://www.weheartswift.com/higher-order-functions-map-filter-reduce-and-more/

1

我建議書「雨燕與IOS 9編程基礎」由馬特·諾伊堡,特別是子章「功能」。

你不僅要找到適合您的問題的答案:

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

而且如何構造函數,返回功能:

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

除了簡要介紹了咖喱功能。

相關問題