forked from ccccourse/sp110b
-
Notifications
You must be signed in to change notification settings - Fork 0
midterm.md
YangTiChu edited this page Jun 16, 2022
·
5 revisions
這個編譯器可以編譯我們在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()
})
})
如果需要將一個很長的閉包表達式作為最後一個參數傳遞給函式,可以使用尾隨閉包(trailing closure)來增強函式的可讀性。當閉包過長以至無法將其寫入單行時,尾隨閉包最有用。例如,Swift 的Array類型有一個map(:)方法,它接受一個閉包表達式作為它的單個參數。尾隨閉包是一個書寫在函式括號()之後的閉包表達式,函式支援將其作為最後一個參數呼叫。當您使用尾隨閉包語法時,您不會將第一個閉包的參數標籤作為函數調用的一部分編寫。 當閉包過長以至於無法將其內聯寫入單行時,尾隨閉包最有用。例如,Swift 的Array類型有一個map(:)方法,它接受一個閉包表達式作為它的單個參數。 以下是一個例子:
// 這是一個參數為閉包的函式
func someFunction(closure: () -> ()) {
// 內部執行的程式
}
// 內部參數名稱為 closure
// 閉包的型別為 () -> () 沒有參數也沒有返回值
// 不使用尾隨閉包進行函式呼叫
someFunction({
// 閉包內的程式
})
// 可以看到這個閉包作為參數 是放在 () 裡面
// 使用尾隨閉包進行函式呼叫
someFunction() {
// 閉包內的程式
}
// 可以看到這個閉包作為參數 位置在 () 後空一格接著寫下去
如果函式只有閉包這一個參數時,甚或是可以將函式的()省略,修改如下:
// 使用尾隨閉包進行函式呼叫 省略函式的 ()
someFunction {
// 閉包內的程式
}