什么时候执行Swift闭包?

时间:2015-12-18 13:21:15

标签: swift swift2

我在Apple的Swift 2.1编程语言指南中看到了这段代码

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

虽然我确实理解内部函数的范围在其执行块之外是如何可用的 - 感谢this,我无法理解如何传递 7 < 作为 increment() 的参数实际上被视为内部函数的参数,当 increment() 实际指向外部函数。

我还想知道 makeIncrementer() 何时实际执行?它是在分配给 increment() 时还是 increment() 获取参数时?

4 个答案:

答案 0 :(得分:1)

makeIncrementer()在执行此操作时完全执行:

var increment = makeIncrementer()

默认情况下,Swift是一种渴望(而不是懒惰)的语言。您可以通过在各个点添加print语句来探索所有这些。

答案 1 :(得分:1)

  

我无法理解当increment()实际指向外部函数时,如果将作为参数传递给increment()的内容实际上被视为内部函数的参数。

increment变量实际上指向内部函数(addOne()),因为那是您从makeIncrementer()返回的内容。因此,当您致电addOne()时会调用increment(7)

  

我还想知道makeIncrementer()实际执行的时间?

一旦你打电话就会执行:

var increment = makeIncrementer()

答案 2 :(得分:1)

前6行定义了一个函数function bportal_tesst_form_alter(&$form, &$form_state, $form_id) { if ($form_id == 'document_node_form') { $form['field_document_file']['und'][0]['#upload_validators']['custom_document_upload_validation'] = array(); } return $form; } function custom_document_upload_validation($file) { $filename = $file->filename; $errors = array(); if (file_exists('/var/www/vhosts/BP/docroot/sites/default/files-private/documents/'.$filename)) { print_r($filename); $errors[] = t("The new file already exists. Please use a different name."); drupal_add_js(drupal_get_path('module','bportal_tesst') . '/js/pop-in.js'); } return $errors; } ,它不带参数并返回一个值。与任何其他函数一样,它在第7行使用makeIncrementer调用。

该函数的返回值恰好是makeIncrementer()类型的另一个函数。这意味着返回的函数采用类型为(Int) -> (Int)的参数,并返回类型为Int的值。

在第7行,返回的值(Int函数)被分配给(Int)->(Int)

因此,第8行,increment变量现在代表一个函数,它接受increment并返回Int。与任何其他函数一样,它使用括号和适当的参数调用:Int

注意:由于未分配increment(7)的返回值,因此简单地丢弃返回值(将为8)。

答案 3 :(得分:0)

makeIncrementer()在被分配到increment var时正在执行。 makeIncrementer()会返回名为function的{​​{1}}。