Swiftは伝統的に、構文の純粋性を重視し、独自のオペレーターを作成(オペレーターのオーバーロード)することを許可します。これには、新しい記号やキーワードさえも含まれます。これにより、DSLの可能性が広がり、コードが非常に表現力豊かになります。
オペレーターの宣言の原則を理解していないと、あいまいで読みにくく、保守が困難なコードを生成する可能性があります。優先度や結合性が誤って選択されると、予期しない結果を引き起こします。コンパイラは制限を指定しない場合、非常に「危険な」式を作成することを許可します。
新しいinfix、prefix、postfixオペレーターを宣言し、それらの優先度と適用範囲を指定できます。例:
infix operator ~> : AdditionPrecedence func ~> (lhs: Int, rhs: Int) -> Int { return lhs * 10 + rhs } let x = 2 ~> 3 // 23
カスタム優先度を宣言する必要があります:
precedencegroup MyPrecedence { associativity: left higherThan: AdditionPrecedence } infix operator *** : MyPrecedence
主な特徴:
オペレーターの宣言とそれに対応する関数を両方実装する必要がありますか?
はい、オペレーターを宣言した場合は、対応する関数を実装する必要があります。そうしないと、コンパイラエラーが発生します。関数は、オペレーターと同じシグネチャを持つ署名を持ちます。
precedencegroupをどのように正しく選択し、グループが計算順序にどのように影響するか?
precedencegroupはinfixオペレーターの計算優先度と結合性を設定します。グループを誤って選択すると、複数のオペレーターを含む式で予期しない結果を引き起こす可能性があります(例えば、乗算/加算とカスタムオペレーター)。
テキスト名でカスタムオペレーターを宣言できますか?
いいえ、カスタムオペレーターはSwiftの構文で定義された特別な記号やシーケンスを通じてのみ利用可能です。テキストの標準名はオペレーターとして宣言するためには許可されていません。
プロジェクトでは、前提条件、結合性、ドキュメントなしで、コレクションの奇妙な変換のためにオペレーター<<<と>>>が宣言されました。新しい従業員は、何をしているのか、式がどのように計算されるのかを理解していませんでした。
メリット:
デメリット:
プロジェクトでは、宣言された優先度とドキュメント化された実装を持つchainable pipelineを宣言的に構築するためにカスタムオペレーター=>を使用しました。すべての開発者は、何をしているのか、どのように使用されるのかを理解していました。
メリット:
デメリット: