2017-01-18 5 views
5

私は閉鎖よりも優先順位の高いグループでSwiftでカスタム演算子を定義しようとしています。特に、私は書くことができるようにしたい:閉鎖より優先順位の高いグループ

foo --> bar { 
    //... 
} 

-->オペレータは、それが唯一のパラメータだとタイプ() -> Voidの閉鎖を取る関数を返します。

しかし、私は唯一の

(foo --> bar) { 
    //... 
} 

作業を取得することができました。括弧なしでこの作業を行うことができる演算子の優先順位はありますか?

はここ

precedencegroup LongArrowPrecedence { 
    associativity: left 
    higherThan: AssignmentPrecedence 
} 

infix operator --> : LongArrowPrecedence 

感謝のための優先順位のグループです!

答えて

5

我々は最初の完全かつ検証例セットアップ:

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には適用されません。これを回避することはできません。後者(およびその「優先順位」)は、関数呼び出し式の文法によって定義されます。

関連する問題