Closed6
SE279: Multiple Trailing Closures(よくわかりませんでした。)
ASIS: 一つのtrailing-closureのみ、 hoge(a: 1) {_ in } みたいな形でかけた。
TOBE: 複数のtrailing-closureが許される。
e.g. SwiftUIでよく見られるやつ
ASIS:
Section(
header: ...,
footer: ...
) {
// content
}
TOBE:
Section {
// content
} header: {
...
} footer: {
...
}
Detailed Design(よくわからない)
- 既存のtrailing-closureは、新しいtrailing-closureの特別なケースとして扱われる?(label omission)
- 普通は、(TOBE)trailing-closureにはラベルが必要
- (ASIS)Trailing-closureは、最後のclosureだけ特別待遇(label omission)
新しいプロポーザルでは、label omissionを最後の場所以外でもできるようにする。
func pointFromClosures(
x: () -> Int,
_ y: () -> Int
) -> (Int, Int) {
(x(), y())
}
pointFromClosures { 10 } _: { 20 } // Ok
func performAsync(
action: @escaping () -> Void,
completionOnMainThread: @escaping () -> Void
) {
...
}
performAsync {
// some action
} _: { // Not okay: must use completionOnMainThread:
window.exit()
}
一つのclosureはラベルを省略できる?
Detailed Design 2
既存のルールでは、限定的な後方スキャンを行う。
新しいルールでは、ラベルマッチをしながら、後方スキャンを行う? そいて、最後のラベルから、限定的な後方スキャンを行う?
複数のclosureを引数に取っていて、default argumentがあると、 既存の挙動のように、最後のclosureに当て嵌めようとする?
func foo(a: () -> Int = { 42 }, b: Any? = nil) {}
foo {
42 <= b
}
新しいルールでは、ラベルなし引数のマッチの前に、最後 のlabled trailing-closureから後方スキャンを始める。
このスクラップは2024/04/20にクローズされました