2015-12-18 110 views
0

我看到這一段代碼雨燕2.1編程語言指南從蘋果什麼時候執行Swift封閉?

func makeIncrementer() -> ((Int) -> Int) { 
    func addOne(number: Int) -> Int { 
     return 1 + number 
    } 
    return addOne 
} 
var increment = makeIncrementer() 
increment(7) 

雖然我明白了內部函數的範圍如何,請外面的執行塊 - 感謝this,我不能理解如何通過作爲參數來增量()實際上被作爲參數傳遞給內部函數,當增量()實際上指向到t他外在的功能。

我也想知道什麼時候makeIncrementer()實際執行?當它被分配到增量()或當增量()獲取參數傳遞?

回答

1

你的第一個6行定義一個函數makeIncrementer,它沒有參數和返回值。像任何其他函數一樣,它在第7行被調用makeIncrementer()

該函數的返回值碰巧是(Int) -> (Int)類型的另一個函數。這意味着返回的函數採用類型爲Int的參數並返回類型爲Int的值。

在第7行上,返回值((Int)->(Int)函數)分配給increment

因此,第8行中,increment變量現在表示一個函數,它需要一個Int並返回一個Int。像任何其他函數一樣,它使用括號和適當的參數來調用:increment(7)

注意:因爲沒有分配increment(7)的返回值,所以簡單地丟棄返回值(將是8)。

+0

感謝您的詳細解答。現在很清楚。 –

1

makeIncrementer()執行什麼時候它看起來像它的執行,在這條線:

var increment = makeIncrementer() 

斯威夫特是默認的渴望(而不是懶惰)語言。您可以通過在各個點添加print聲明來探索所有這些。

+0

我做到了。但我誤解了遊樂場輸出的內容。當我看到(Int-> Int)時,我沒有停下來認爲makeIncrementer綁定到一個函數,而不僅僅是來自該函數的返回值。相信後者導致了混亂。不管怎麼說,多謝拉! –

0

makeIncrementer()當它被分配到increment var時正在執行。 makeIncrementer()返回名爲addOne(number:)function

+0

它指向addOne()還是指向包裝addOne()的無名方法?儘管我明白了@adpalumbo的答案。謝謝! –

1

我不明白如何將increment 7作爲參數傳遞給increment()實際上是作爲內部函數的參數,當increment()實際上指向外部函數時。

increment變量實際上指向內部函數(addOne()),因爲這就是你從makeIncrementer()返回。因此,當您致電increment(7)時,會調用addOne()

我也想知道什麼時候makeIncrementer()被實際執行?

它,只要你把它叫做執行:

var increment = makeIncrementer() 
+0

它指向addOne()還是指向包裝addOne()的無名方法?儘管我明白了@adpalumbo的答案。謝謝! –

相關問題