swift3 - 错误 : not conform to protocol 'Equatable'

标签 swift3 xcode8

我是 swift 新手,并按照教程了解更多信息。

在下面的代码中,我定义了自定义运算符(< 和 ==),但是代码工作正常,但 Xcode 在第一行代码中显示了这些错误。

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

怎么了?

最佳答案

在 Swift 3 中,协议(protocol)所需的运算符被声明为静态成员。

使用此类协议(protocol)的一种方法是将运算符定义作为静态成员移动到结构中:

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
    }
}

另一种方式,您可以使用扩展声明对协议(protocol)的一致性:
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 {}

关于swift3 - 错误 : not conform to protocol 'Equatable' ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41776448/

相关文章:

ios - 如何比较 2 个 UIColor 对象,它们是日志中的 kCGColorSpaceModelRGB 和 UIExtendedSRGBColorSpace 实例?

c++ - Xcode 8.3.3 C++ 中的错误语法突出显示

ios - 此 iPhone 6 运行的是 iOS 10.1 (14B55c),此版本的 Xcode 可能不支持

ios - 有时 Xcode 8(自动布局)中有额外的间距(边距),为什么?

ios - 如何将数组转换为 UnsafeMutablePointer<UnsafeRawPointer?> Swift 3.0?

loops - 快速计算最大值的最有效方法

ios - 当我点击 uitableviewcell 中的 uiimageview 时,应用程序崩溃

ios - 升级到 Xcode 8 和 Swift 3.0 后使用 Google Places iOS SDK 出现无法解释的异常

ios - 代码 8 : 'objc_unretainedPointer' is unavailable use a __bridge cast instead

swift - 无法运行 "The file “***.app” 无法打开,因为您没有查看权限”