Closed6

SE279: Multiple Trailing Closures(よくわかりませんでした。)

UeeekUeeek

ASIS: 一つのtrailing-closureのみ、 hoge(a: 1) {_ in } みたいな形でかけた。
TOBE: 複数のtrailing-closureが許される。

e.g. SwiftUIでよく見られるやつ
ASIS:

Section(
  header: ...,
  footer: ...
) {
  // content
}

TOBE:

Section {
  // content
} header: {
  ...
} footer: {
  ...
}
UeeekUeeek

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はラベルを省略できる?

UeeekUeeek

Detailed Design 2

既存のルールでは、限定的な後方スキャンを行う。
新しいルールでは、ラベルマッチをしながら、後方スキャンを行う? そいて、最後のラベルから、限定的な後方スキャンを行う?

UeeekUeeek

複数のclosureを引数に取っていて、default argumentがあると、 既存の挙動のように、最後のclosureに当て嵌めようとする?

func foo(a: () -> Int = { 42 }, b: Any? = nil) {}

foo {
  42 <= b
}
UeeekUeeek

新しいルールでは、ラベルなし引数のマッチの前に、最後 のlabled trailing-closureから後方スキャンを始める。

このスクラップは2024/04/20にクローズされました