Swift - 如何将枚举与关联值进行比较?
Swift - How to compare enum with associated values?
我正在尝试编写 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
决定是否return与枚举完全匹配、较低匹配或较高匹配,
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
}
}
我想做的是:
如果我在一些 orders
和 units
中喂 class 我应该能够测试 matchType
是否是 perfect
, lower
或 higher
.
但是,在我的测试中,我不得不写类似这样的东西:
XCTAssertEqual(handler.matchType!, MatchType.perfectMatch(0, 0))
我在 (0,0) 中输入索引和值 returned.
是否可以在不知道具体数字的情况下对枚举进行比较?
您可以使用 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
}
我正在尝试编写 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
决定是否return与枚举完全匹配、较低匹配或较高匹配,
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
}
}
我想做的是:
如果我在一些 orders
和 units
中喂 class 我应该能够测试 matchType
是否是 perfect
, lower
或 higher
.
但是,在我的测试中,我不得不写类似这样的东西:
XCTAssertEqual(handler.matchType!, MatchType.perfectMatch(0, 0))
我在 (0,0) 中输入索引和值 returned.
是否可以在不知道具体数字的情况下对枚举进行比较?
您可以使用 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
}