17852


詳解swiftで勉強しています。

プロトコルの定義のところで、Comparableプロトコルを列挙型に適合する場合、  
実体型をもつ列挙型は、すでに「＝＝」をもっていますとあるのですが、

通常の列挙型（実体型ではない）は「＝＝」が使用できないように思えるのですが、  
実際は使用できます。

この意味は、どう理解すべきでしょうか


CC BY-SA 3.0
2015-10-20T08:22:05.923
17848
2015-10-20T11:08:58.360
11148
question
swift
列挙型の２項演算子について

[code]

    enum CompassPoint {
        case North
        case South
        case East
        case West
    }
    
[/code]

上記のような、Assciated Valueを持たない単なるEnumはコンパイラによって自動的に`Equatable`になります。

> Simple enums that have no associated data (like MyBool) are automatically
> made Equatable by the compiler, so no additional code is required.  
>  <https://developer.apple.com/swift/blog/?id=8>

  

そのため、`==`で比較する際には下記で定義されいている演算子が使用されます。

[code]

    public func ==<T : Equatable>(lhs: T?, rhs: T?) -> Bool
    
[/code]

  

[code]

    enum Barcode {
        case UPCA(Int, Int, Int, Int)
        case QRCode(String)
    }
    
[/code]

一方、上記のようなAssociated Valueを持つEnumはそうはならないので、自分で`==`を実装する必要があります。

> However, you can make arbitrary types equatable by conforming to the
> Equatable protocol and implementing the == operator.  
>  <https://developer.apple.com/swift/blog/?id=8>

  

[code]

    enum Math: Double {
        case Pi = 3.1415
        case Phi = 1.6180
        case Tau = 6.2831
    }
    
[/code]

上記のようなDoubleやStringを継承しているようなEnumで`==`による比較ができるのは`RawRepresentable`に適合するので、下記の演算子が使用されるためです。

[code]

    func ==<T : RawRepresentable where T.RawValue : Equatable>(lhs: T, rhs: T) -> Bool
    
[/code]


CC BY-SA 3.0
2015-10-20T10:30:21.007
17852
2015-10-20T11:08:58.360
2015-10-20T11:08:58.360
5519
5519
17848
answer