次の 2 つの式を見てください。
baz(Foo<Bar, Bar>(0))
baz(Foo < Bar, Bar > (0))
baz
、 、Foo
およびBar
が (baz
型またはメソッドであるFoo
可能性があり、型または変数である可能性がある)を知らなければ、 が型引数リストを表すのか小なり演算子を表すのBar
かを明確にする方法はありません。<
// two different outcomes, difference shown with parentheses
baz((Foo<Bar,Bar>(0))) // generics
baz((Foo < Bar), (Bar > 0)) // less-than
適切なプログラミング言語は、このような式を解析するときに whatbaz
に依存するべきではFoo
ありません。Bar
それでも、Swift は、空白をどこに置いても、以下の式のあいまいさを解消することができます。
println(Dictionary<String, String>(0))
println(Dictionary < String, String > (0))
コンパイラはこれをどのように管理しますか? そして、さらに重要なことに、Swift 言語仕様には何か場所があります。このためのルールが記述されています。Language Reference
Swift bookの一部を調べたところ、次のセクションしか見つかりませんでした。
特定の構文では、先頭に
<
or>
が付いた演算子が 2 つ以上のトークンに分割される場合があります。残りは同じ方法で処理され、再度分割される場合があります。>
その結果、 のような構造で終了文字間のあいまいさを解消するために空白を使用する必要はありませんDictionary<String, Array<Int>>
。この例では、終了>
文字は単一のトークンとして扱われず、ビット シフト>>
演算子として誤って解釈される可能性があります。
この文脈でとは何certain constructs
を指しますか? 実際の文法には、型引数に言及する生成規則が 1 つだけ含まれています。
明示的なメンバ式 → 後置式の
.
識別子ジェネリック引数句のオプション
説明やリソースをいただければ幸いです。