Skip to content

midterm.md

YangTiChu edited this page Jun 16, 2022 · 5 revisions

js-trailing-closure-toy-compiler

這個編譯器可以編譯我們在JavaScript中使用Swift的尾閉包語法,將其變成正常的JavaScript語法。

通過這個編譯器我們可以將下面的代碼:

a(){}

轉換為:

a(() => {});

或者將:

a(1, "hello"){ b, c in
    d()
    d{}
    d(1, "hello")
    d(1, "hello"){}
    d(1, "hello"){ e, f in
        g()
    }
}

轉換為:

a(1, "hello", (b, c) => {
    d();
    d(() => {});
    d(1, "hello");
    d(1, "hello", () => {});
    d(1, "hello", (e, f) => {
        g()
    })
})

Swift 尾隨閉包

如果需要將一個很長的閉包表達式作為最後一個參數傳遞給函式,可以使用尾隨閉包(trailing closure)來增強函式的可讀性。當閉包過長以至無法將其寫入單行時,尾隨閉包最有用。例如,Swift 的Array類型有一個map(:)方法,它接受一個閉包表達式作為它的單個參數。尾隨閉包是一個書寫在函式括號()之後的閉包表達式,函式支援將其作為最後一個參數呼叫。當您使用尾隨閉包語法時,您不會將第一個閉包的參數標籤作為函數調用的一部分編寫。 當閉包過長以至於無法將其內聯寫入單行時,尾隨閉包最有用。例如,Swift 的Array類型有一個map(:)方法,它接受一個閉包表達式作為它的單個參數。 以下是一個例子:

// 這是一個參數為閉包的函式
func someFunction(closure: () -> ()) {
    // 內部執行的程式
}
// 內部參數名稱為 closure
// 閉包的型別為 () -> () 沒有參數也沒有返回值

// 不使用尾隨閉包進行函式呼叫
someFunction({
    // 閉包內的程式
})
// 可以看到這個閉包作為參數 是放在 () 裡面

// 使用尾隨閉包進行函式呼叫
someFunction() {
  // 閉包內的程式
}
// 可以看到這個閉包作為參數 位置在 () 後空一格接著寫下去

如果函式只有閉包這一個參數時,甚或是可以將函式的()省略,修改如下:

// 使用尾隨閉包進行函式呼叫 省略函式的 ()
someFunction {
  // 閉包內的程式
}

來源1

來源2

來源3

Clone this wiki locally