質問: AClass() print( a ``` BaseProtocolには、二つのstatic関数が宣言されており、 このプロトコルを適合する場合、2つの関数を実装します。 このとき、構造体のメンバとして実装すべきだと思いますが、 <演算子関数は、メンバ関数としてまたはグローバル関数としてとどちらでも定義できます。 下記のMethodA()はメンバ関数としてしか実装できません。 この違いは、演算子とそうでないものに見えますが、なぜ演算子はそのようなことが 許されるのでしょうか。教えてください。 疑問なのは、演算子をグローバル関数として実装したとき、 AClassがBaseProtcolに適合しているといえるのかというところです。
回答: The Swift Programming Language (Swift 3.0.1) - Advanced Operators このApple文書を調べてみました。この中の「Operator Methods」の項で、プロトコルでなく、構造体における演算子の定義(新規定義と、オーバーロード含めて)について、旧版(Swift 2.2)と比べてみました。 *Swift 3.0.1 Edition* > > The operator method is defined as a type method on Vector2D, with a method name that matches the operator to be overloaded (+). > > > (「Vector2D」は、サンプルコード中の構造体名) *Swift 2.2 Edition* > > The operator function is defined as a global function with a function name that matches the operator to be overload (+). > > > 大きな変更になっていることがわかります。「グローバル関数」で定義するのは、Swift 2.2のやり方。タイプメソッドで定義するのは、Swift 3.0.1のやり方です。 Xcode 8では、Swift 2の記法が完全に廃止されたものもあれば、このようにSwift 2の記法でも書けるものもあるようです。 やはり、タイプメソッドで、演算子の定義はするべきではないかと思います。