プロトコルから要求される演算子関数

投稿者: Anonymous
protocol BaseProtcol{
    static func <(lhs: Self, rhs: Self) -> Bool
    static func MethodA()-> Bool
}

struct AClass : BaseProtcol{
    static func MethodA()->Bool{
        return true
    }
}

func <(lhs: AClass, rhs: AClass) -> Bool{
    return true
}



let a = AClass()
let b = 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の記法でも書けるものもあるようです。
やはり、タイプメソッドで、演算子の定義はするべきではないかと思います。

回答者: Anonymous

Leave a Reply

Your email address will not be published. Required fields are marked *