Swiftカスタム演算子



私はいつもこのようなことを言語で作成するというアイデアを持っていました.私は数学のクラス日を覚えています、そこで、我々は比例した問題で未知のデータを計算するために紙の上でこのグラフを描きます.

では、どのように迅速に作成することが可能ですか?まず、物事をクリアするには、上記のコードがいくつかのコードフォーマットでそのようになります.
それがなければ、コードは以下のようになります.
let x = 0.8 -->? 0.4 --> 10
ご覧のように、書式設定と疑問符は私たちが計算している値を理解するのに役に立ちます、そして、これが実際には1つのカスタム演算子ではなく、2つのカスタム演算子が数学演算を形成することは顕著です.シンボル--> から使用されている-> Swiftの予約記号です.
そこで、私の最初の考えはカスタムの三元演算子を作成することでしたが、少なくとも今のところ、これは高速では不可能です.私たちができることは2つのカスタム演算子を作成することです--> は簡単です、それはちょうど左と右の値をタプルします(Double, Double) . The -->? 演算子は、すべての値を持っているので、数学の計算を実行するものです.受信するDouble 左と右の値をタプルを返します() -> (Double, Double) どれが正確に--> 演算子は.
infix operator -->?: TernaryPrecedence

func -->?(lhs: Double,
          rhs: @escaping @autoclosure () -> (Double, Double)
) -> Double {
    return lhs * rhs().1 / rhs().0
}

infix operator -->

func -->(lhs: Double, rhs: Double) -> (Double, Double) {
    return (lhs, rhs)
}

let x = 0.8 -->?
        0.4 --> 10
https://github.com/nuno-vieira/RuleOf3-CustomOperator-Swift-Playground

それをちょっと壊しましょう



この演算子は自明であり、それはダブルLHSDouble rhs (右側)引数で、タプルで返します.(0.4, 10) . それは2つのターゲットで動作しているので、init演算子ですので、左と右側の引数を持っている理由です.また、優先順位グループを指定していないため、複数の操作を連鎖させることに興味がないので、結合性のない既定値を持っています.

→?


これはすべての魔法が起こる場所です🧙‍♂️✨. また、LHER引数では、未知の割合で知りたい値を持ち、RHS上で引数として関数を受け取ります--> クロージャにラップされているので、既知の比例値を使用してタプルを与えることができます.The @autoclosure キーワードは括弧括弧なしで閉鎖を書こうとするのが重要です.
let x = 0.8 -->? { 0.4 -> 10 }
The TerneraryPrecedence 右の連想は、我々が望むものであるので、正しい表現は最初に評価されます.

結論


Swiftはカスタムオペレータと非常に創造的になりましょう、これを実際に作るのは本当に楽しかったですが、もちろん、私たちはCodeBaseのカスタマー演算子を使用することを決定するとき、特に複数の開発者のチームで働くときには注意する必要があります.我々は、できるだけ簡単に我々のcodebaseを作りたいとカスタムオペレータを導入するボード上の新参者にしてください.DSLを非常に特定の問題のために構築していない場合や、特定のドメインでコードベースを明確に改善するカスタム演算子であるなら、カスタム演算子を使いすぎないようにします.