Swiftでは、カスタム演算子に使用する独自の優先グループを定義できます。私が理解するのに苦労しているのは、ブール値assignment
のプロパティです。 スウィフトプログラミング言語(スイフト3.1)からSwiftでの優先グループの割り当ての理解3.1
:オプションのチェーンを含む動作に使用される場合
優先グループの割り当ては、オペレータの優先順位を指定します。
true
に設定すると、対応する優先グループの演算子は、標準ライブラリからの代入演算子として、オプションの連鎖中に同じグループ化規則を使用します。そうでない場合、false
に設定するか省略すると、優先グループの演算子は、割り当てを実行しない演算子と同じオプションの連鎖規則に従います。
assignment
プロパティの正確な動作についてはあまり言及していません。オプションの連鎖における代入演算子と非代入演算子の違いは何ですか?
Iは、試験のための構造体をAssignmentTestingとともに演算子(+
ように動作)(+=
ように振る舞う)++=
を定義し、++
。 assignment: true
とassignment: false
は、これらの行動に影響を与えるにはどうすればよい
precedencegroup AssignmentTrue {
assignment: true
}
precedencegroup AssignmentFalse {
assignment: false
}
infix operator ++=: AssignmentTrue
infix operator ++: AssignmentFalse
extension Int {
static funC++= (left: inout Int, right: Int) {
left += right
}
static funC++ (left: Int, right: Int) -> Int {
return left + right
}
}
struct AssignmentTesting { var number = 0 }
var assignmentTesting: AssignmentTesting? = AssignmentTesting()
assignmentTesting?.number ++= 3 // assigns 0 + 3 to assignmentTesting.number
assignmentTesting!.number ++ 5 // returns 3 + 5
assignmentTesting?.number // == 3
?どんな説明も大歓迎です。
私はまだ違いを理解していません。なぜinoutパラメータの性質がそれを処理できないのですか?私は、Swift 2.2の動作について素敵な説明を見つけました。「Swift 2.2には、次のように動作する代入修飾子があります:演算子のマークされた代入が任意のチェーンに折りたたまれ、 'foo?.bar + = 2' '(foo?.bar)+ = 2'という型チェックに失敗するのではなく' foo?(.bar + = 2) 'として動作します。この動作は先行グループの代入:trueに渡されます。それはまだ私には漠然としている。 –
Swift 2で代入演算子を宣言する構文を記述し、Swift 3での意味や振る舞いは同じです。 'inout'を使う他の演算子を定義する必要があるかもしれませんが、assign_の_Optional連鎖は望ましくありません。 – OOPer
代入演算子と非代入演算子の間のオプションの連鎖の違いについて、詳しく説明できますか?私は非常に興味があるのですが、なぜオプションチェーンで代入を処理するために必要な別のパラメータがあるのですか? 'precedencegroup'に新しい構文を導入することは十分に重要です。 –