31969

[code]

    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 
[/code]

BaseProtocolには、二つのstatic関数が宣言されており、  
このプロトコルを適合する場合、２つの関数を実装します。

このとき、構造体のメンバとして実装すべきだと思いますが、  
＜演算子関数は、メンバ関数としてまたはグローバル関数としてとどちらでも定義できます。  
下記のMethodA()はメンバ関数としてしか実装できません。

この違いは、演算子とそうでないものに見えますが、なぜ演算子はそのようなことが  
許されるのでしょうか。教えてください。

疑問なのは、演算子をグローバル関数として実装したとき、  
AClassがBaseProtcolに適合しているといえるのかというところです。


CC BY-SA 3.0
2017-01-18T07:08:23.977
31939
2017-01-19T06:48:34.220
2017-01-18T07:14:15.773
11148
11148
question
swift swift3
プロトコルから要求される演算子関数


[The Swift Programming Language (Swift 3.0.1) - Advanced
Operators](https://developer.apple.com/library/prerelease/content/documentation/Swift/Conceptual/Swift_Programming_Language/AdvancedOperators.html#//apple_ref/doc/uid/TP40014097-CH27-ID28)  
この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の記法でも書けるものもあるようです。  
やはり、タイプメソッドで、演算子の定義はするべきではないかと思います。


CC BY-SA 3.0
2017-01-19T06:48:34.220
31969
2017-01-19T06:48:34.220
18540
31939
answer