2017-01-21 6 views
2

詳細はチュートリアルに従ってください。エラー:プロトコル「適合」に準拠していません

In次のコードでは、カスタム演算子(<と==)を定義していますが、コードは正常に動作しますが、xcodeはこれらのエラーを1行目のコードで示しています。ここ

Type 'SuitedCard' does not conform to protocol 'Equatable' 
Type 'SuitedCard' does not conform to protocol 'Comparable' 

はコードです:

struct SuitedCard: Equatable, Comparable { 

    // a card can be ♥️, ♣️, ♦️, ♠️ 
    enum Suit { 
     case hearts 
     case spades 
     case diamonds 
     case clubs 
    } 

    // the possible values of a card 
    enum Value: Int { 
     case two = 2 
     case three = 3 
     case four = 4 
     case five = 5 
     case six = 6 
     case seven = 7 
     case eight = 8 
     case nine = 9 
     case ten = 10 
     case jack = 11 
     case queen = 12 
     case king = 13 
     case ace = 14 
    } 

    // properties 
    let suit: Suit 
    let value: Value 
    var isFaceDown: Bool 
} 

var valueArray: [SuitedCard.Value] = [.ten, .jack, .queen, .king] 


func ==(lhs: SuitedCard, rhs: SuitedCard) -> Bool { 
    for cardValue in valueArray { 
     if lhs.value == cardValue { 
      for cardValue2 in valueArray { 
       if rhs.value == cardValue2 { 
        return true 
       } 
      } 
     } 
    } 
    if lhs.value == rhs.value { 
     return true 
    } 
    return false 
} 

func <(lhs: SuitedCard, rhs: SuitedCard) -> Bool { 
    var lhsRawValue: Int 
    var rhsRawValue: Int 
    if lhs.value == .jack || lhs.value == .queen || lhs.value == .king { 
     lhsRawValue = 10 
    } else { 
     lhsRawValue = lhs.value.rawValue 
    } 
    if rhs.value == .jack || rhs.value == .queen || rhs.value == .king { 
     rhsRawValue = 10 
    } else { 
     rhsRawValue = rhs.value.rawValue 
    } 
    return lhsRawValue < rhsRawValue 
} 

let smaller = SuitedCard(suit: .hearts, value: .five, isFaceDown: true) 

let bigger = SuitedCard(suit: .diamonds, value: .six, isFaceDown: false) 

smaller >= smaller 

smaller < bigger 

間違っているのですか?

答えて

3

Swift 3では、プロトコルに必要なオペレータは静的メンバーとして宣言されています。

struct SuitedCard: Comparable { //### Comparable implies Equatable 

    //... 

    // function for custom operator == 
    static func ==(lhs: SuitedCard, rhs: SuitedCard) -> Bool { 
     //... 
     return false 
    } 
    // function for custom operator < 
    static func <(lhs: SuitedCard, rhs: SuitedCard) -> Bool { 
     //... 
     return false 
    } 
} 

もう一つの方法は、あなたが拡張機能を使用してプロトコルへの適合を宣言することができます。そのようなプロトコルで動作するように

一つの方法は、静的メンバとして構造体にあなたのオペレータの定義を移動しています

struct SuitedCard { 

    //... 
} 

// function for custom operator == 
func ==(lhs: SuitedCard, rhs: SuitedCard) -> Bool { 
    //... 
    return false 
} 
// function for custom operator < 
func <(lhs: SuitedCard, rhs: SuitedCard) -> Bool { 
    //... 
    return false 
} 

extension SuitedCard: Comparable {} 
0

OOPerの答えは問題を解決しますが、Swift 3では演算子メソッドをクラス/構造体の外部で定義することもできます。この場合、valueArray宣言を==メソッドの本体に移動するだけで問題は解決されます。ここで修正されたコードは次のとおりです。valueArrayの

//宣言はここに移動

struct SuitedCard: Equatable, Comparable { 

    // a card can be ♥️, ♣️, ♦️, ♠️ 
    enum Suit { 
     case hearts 
     case spades 
     case diamonds 
     case clubs 
    } 

    // the possible values of a card 
    enum Value: Int { 
     case two = 2 
     case three = 3 
     case four = 4 
     case five = 5 
     case six = 6 
     case seven = 7 
     case eight = 8 
     case nine = 9 
     case ten = 10 
     case jack = 11 
     case queen = 12 
     case king = 13 
     case ace = 14 
    } 

    // properties 
    let suit: Suit 
    let value: Value 
    var isFaceDown: Bool 
} 


func ==(lhs: SuitedCard, rhs: SuitedCard) -> Bool { 

let valueArray: [SuitedCard.Value] = [.ten, .jack, .queen, .king] 
    for cardValue in valueArray { 
     if lhs.value == cardValue { 
      for cardValue2 in valueArray { 
       if rhs.value == cardValue2 { 
        return true 
       } 
      } 
     } 
    } 
    if lhs.value == rhs.value { 
     return true 
    } 
    return false 
} 

func <(lhs: SuitedCard, rhs: SuitedCard) -> Bool { 
    var lhsRawValue: Int 
    var rhsRawValue: Int 
    if lhs.value == .jack || lhs.value == .queen || lhs.value == .king { 
     lhsRawValue = 10 
    } else { 
     lhsRawValue = lhs.value.rawValue 
    } 
    if rhs.value == .jack || rhs.value == .queen || rhs.value == .king { 
     rhsRawValue = 10 
    } else { 
     rhsRawValue = rhs.value.rawValue 
    } 
    return lhsRawValue < rhsRawValue 
} 

let smaller = SuitedCard(suit: .hearts, value: .five, isFaceDown: true) 

let bigger = SuitedCard(suit: .diamonds, value: .six, isFaceDown: false) 

smaller >= smaller 

smaller < bigger 
関連する問題