我々は最初の完全かつ検証例セットアップ:
precedencegroup LongArrowPrecedence {
associativity: left
higherThan: AssignmentPrecedence
}
infix operator --> : LongArrowPrecedence
func -->(lhs: Int, rhs: Int) -> (() ->()) ->() {
return { print(lhs+rhs, terminator: ""); $0() }
}
と同様に、この演算子を使用してparanthesis-包含有効なコールの例を、を直ちに閉鎖-->
戻りへの呼び出しが続きます。
let foo = 1
let bar = 2
// OK
(foo --> bar) {
print(" is the magic number")
} // 3 is the magic number
// OK
((-->)(foo, bar)) {
print(" is the magic number")
} // 3 is the magic number
これは非常に私たちに教えてくれませんが、我々は、以下の失敗例を勉強している場合
// ERROR: cannot call value of non-function type 'Int'
foo --> bar {
print(" is the magic number")
} // 3 is the magic number
// ... equivalent to
// ERROR: cannot call value of non-function type 'Int'
foo --> bar({
print(" is the magic number")
}) // 3 is the magic number
我々はここでの問題は「閉鎖よりも優先低く」ではないことを認識ではなく、 function-call-argument-clause(任意のpostfix-expressionに続く一組のparantheses)は、postfix-expressionがメソッド/関数/クロージャであるかのように、の呼び出しをそのpostfix-expressionに試みます。 postfix-expressionが呼び出し可能でない場合、またはfunction-call-argument-clause内の呼び出しが呼び出し可能な呼び出しのオーバーロードと一致しない場合、コンパイラーはエラーを生成します。したがって
42() // ERROR: cannot call value of non-function type 'Int'
let foo = 42
foo() // ERROR: cannot call value of non-function type 'Int'
func bar() {} // ERROR: argument passed to call that takes no arguments
bar(42)
、閉鎖に供給され、末尾の閉鎖は-->
から返され、ここでは関係ありません:それは単に返されたクロージャの引数ですが、重要な問題は、スウィフトは、関数呼び出しの引数-句を適用することであるのに対し、その節の直前にあるpostfix-expressionに渡します。あなたの例では、bar
がその接尾辞の式を構成し、foo --> bar
をparanthesesで囲む場合にのみ、結合された包み込まれた式は、次のfunction-call-argument-clauseが適用されるpostfix-expressionを構成します。
Postfixの式
Postfixの式は式に後置オペレータまたは他の 後置構文を適用することによって形成されています。 文法上、すべてのプライマリ の式も後置式です。
一次式
一次式は、式の最も基本的な種類があります。それらは単独で式として使用される であり、他の トークンと組み合わせて、接頭辞式、バイナリ式、および接尾辞 式を作成することができます。
operator-precedenceはfunction-call-argument-clauseには適用されません。これを回避することはできません。後者(およびその「優先順位」)は、関数呼び出し式の文法によって定義されます。