Swift-如何将枚举与关联值进行比较?

Swift-如何将枚举与关联值进行比较?,swift,enums,xctest,Swift,Enums,Xctest,我正试图编写一个XCTest来验证与枚举中关联值的比较 例如: enum MatchType : Equatable { case perfectMatch(Int, Int) case lowerMatch(Int, Int) case higherMatch(Int, Int) } extension MatchType { static func == (lhs: MatchType, rhs: MatchType) -> Bool {

我正试图编写一个XCTest来验证与枚举中关联值的比较

例如:

enum MatchType : Equatable {
    case perfectMatch(Int, Int)
    case lowerMatch(Int, Int)
    case higherMatch(Int, Int)
}

extension MatchType {
    static func == (lhs: MatchType, rhs: MatchType) -> Bool {
        switch (lhs, rhs) {
        case (.perfectMatch, .perfectMatch):
            return true
        case (.lowerMatch, .lowerMatch):
            return true
        case (.higherMatch, .higherMatch):
            return true
        default:
            return false
        }
    }
}
如何进行比较以确保正确的枚举,而不具体知道int是什么

在我的测试中,我会这样做:

func testPerfectMatch() {
        let orders = [6]
        let units = 6

        let handler = SalesRuleHandler(orders: orders, units: units)

        XCTAssertEqual(handler.matchType!, MatchType.perfectMatch(0, 0))
    }
SalesRuleHandler
决定是返回与枚举的完全匹配、较低匹配还是较高匹配

class SalesRuleHandler {

private var orders: [Int]
private var units: Int
var matchType: MatchType?

init(orders: [Int], units: Int) {
    self.orders = orders
    self.units = units
    self.matchType = self.handler()
}

private func handler() -> MatchType? {
    let rule = SalesRules(orders)

    if let match = rule.perfectMatch(units) {
        print("Found perfect match for: \(units) in orders \(rule.orders) at index: \(match.0) which is the value \(match.1)")
        return MatchType.perfectMatch(match.0, match.1)
    }
    else {
        if let match = rule.lowerMatch(units) {
            print("Found lower match for: \(units) in orders \(rule.orders) at index: \(match.0) which is the value \(match.1)")
            return MatchType.lowerMatch(match.0, match.1)
        }
        else {
            if let match = rule.higherMatch(units) {
                return MatchType.higherMatch(match.0, match.1)
            }
        }
    }
    return nil
}
}

我想做的是:

如果我以一些
顺序
单元
为类提供数据,我应该能够测试
匹配类型
是否是
完美的
较低的
较高的

然而,在我的测试中,我必须写下如下内容:

xctasertequal(handler.matchType!、matchType.perfectMatch(0,0))

其中(0,0)输入索引,返回值


是否可以在不知道具体数字的情况下对枚举进行比较?

您可以使用
case
访问枚举的关联值

switch (lhs, rhs) {
case (.perfectMatch(let a, let b), .perfectMatch(let c, let d):
    // check equality of associated values
    return a == c && b == d
// other cases...
}
您还可以使用
if
语句访问如下关联值:

if case .perfectMatch(let a, let b) = handler.matchType {
    // do something with a and b
}

您可以使用
case
访问枚举的关联值

switch (lhs, rhs) {
case (.perfectMatch(let a, let b), .perfectMatch(let c, let d):
    // check equality of associated values
    return a == c && b == d
// other cases...
}
您还可以使用
if
语句访问如下关联值:

if case .perfectMatch(let a, let b) = handler.matchType {
    // do something with a and b
}

我不确定我是否正确理解你的问题。是否还要比较整数?因此,只有当两种情况相同且它们的关联值也相同时,才返回true?我想我只是试图使我提出的解决方案过于复杂,并将我要检查的值分开。我只想检查枚举,而不是整数——可能有一种情况,我不知道整数是什么(或者它们是后来创建的),我能检查的唯一“常量”是枚举,我不确定我是否正确理解了你的问题。是否还要比较整数?因此,只有当两种情况相同且它们的关联值也相同时,才返回true?我想我只是试图使我提出的解决方案过于复杂,并将我要检查的值分开。我只想检查枚举,而不是整数——可能有一种情况,我不知道整数是什么(或者它们是后来创建的),我能检查的唯一“常量”是枚举,好的。这是有道理的。虽然我想我试图把我要做的事情过度复杂化,结果在不同的变量中分离了枚举和元组。啊,好的。这是有道理的。虽然我想我试图把我要做的事情过度复杂化,结果在不同的变量中分离了枚举和元组。