web-dev-qa-db-ja.com

Swift3:優先グループの処理方法は、演算子を本文で宣言する必要がありますか?

以前のSwift演算子の3つのコードは:

infix operator × {associativity left precedence 150}

しかし、現在、Xcode 8ベータ6に従って、これにより次の警告が生成されます。

"operator should not be declared with body"

現在、ドキュメントが存在しないため、precedencegroup述語を使用する正しい方法は何ですか?

私はこれを試しましたが、動作しません:

infix operator × : times
precedencegroup times {
     associativity: left 
     precedence: 150
}
23

SE-0077 に従って、演算子の優先順位はマジック番号によって決定されなくなりました。代わりに、定義するためにhigherThanおよび(グループが別のモジュールに存在する場合)lowerThanprecedencegroup関係を使用します他のグループに対する優先順位。

例( 進化提案 から):

// module Swift
precedencegroup Additive { higherThan: Range }
precedencegroup Multiplicative { higherThan: Additive }

// module A
precedencegroup Equivalence {
  higherThan: Comparative
  lowerThan: Additive  // possible, because Additive lies in another module
}
infix operator ~ : Equivalence

1 + 2 ~ 3    // same as (1 + 2) ~ 3, because Additive > Equivalence
1 * 2 ~ 3    // same as (1 * 2) ~ 3, because Multiplicative > Additive > Equivalence
1 < 2 ~ 3    // same as 1 < (2 ~ 3), because Equivalence > Comparative
1 += 2 ~ 3   // same as 1 += (2 ~ 3), because Equivalence > Comparative > Assignment
1 ... 2 ~ 3  // error, because Range and Equivalence are unrelated

あなたの場合、あなたの演算子は乗算に使用されているように見えますが、単純に標準ライブラリのMultiplicationPrecedenceグループを使用できます。これは*演算子に使用されます:

infix operator × : MultiplicationPrecedence

次のように定義されます。

precedencegroup MultiplicationPrecedence {
  associativity: left
  higherThan: AdditionPrecedence
}

標準ライブラリ優先グループの完全なリスト、およびこの変更の詳細については、 evolution提案 を参照してください。

57
Hamish