This question already has answers here:
How to compare enum with associated values by ignoring its associated value in Swift?
(5个答案)
Compiler error when comparing values of enum type with associated values?
(2个答案)
3年前关闭。
语言:Swift2.3
例如,让我向您展示各种枚举
尽管在if-else语句上,我只能对
这是代码示例:
有任何想法吗?我实际上并没有对这段代码做任何事情,我只是想知道为什么我们不能进行比较。
关键是,在Swift中,如果您的枚举使用原始类型或没有关联的值,则只能免费获得枚举的等式(尝试一下,不能同时使用两者)。但是Swift不知道如何将个案与关联的值进行比较-我的意思是怎么可能?让我们来看这个例子:
也许这样可以更清楚地说明为什么它不能开箱即用:
因此,如果您希望枚举具有关联的值,则必须自己在枚举中实现Equatable协议(protocol):
(5个答案)
Compiler error when comparing values of enum type with associated values?
(2个答案)
3年前关闭。
语言:Swift2.3
例如,让我向您展示各种枚举
enum Normal {
case one
case two, three
}
enum NormalRaw: Int {
case one
case two, three
}
enum NormalArg {
case one(Int)
case two, three
}
Switch
可以在所有三个枚举上使用,如下所示:var normal: Normal = .one
var normalRaw: NormalRaw = .one
var normalArg: NormalArg = .one(1)
switch normal {
case .one: print("1")
default: break
}
switch normalRaw {
case .one: print(normalRaw.rawValue)
default: break
}
switch normalArg {
case .one(let value): print(value)
default: break
}
尽管在if-else语句上,我只能对
Normal
和NormalRaw
进行比较,并且对于NormalArg
显示错误消息,所以我无法运行代码这是代码示例:
if normal == .two { // no issue
.. do something
}
if normalRaw == .two { // no issue
.. do something
}
if normalArg == .two { // error here (the above message)
.. do something
}
if normalArg == .one(_) { // error here (the above message)
.. do something
}
if normalArg == .three { // error here (the above message)
.. do something
}
有任何想法吗?我实际上并没有对这段代码做任何事情,我只是想知道为什么我们不能进行比较。
最佳答案
诀窍是实际上不使用==进行检查,而是在if语句中将case
关键字与单个=结合使用。刚开始时这有点反常,但是就像if let
一样,您很快就习惯了:
enum Normal {
case one
case two, three
}
enum NormalRaw: Int {
case one = 1
case two, three
}
enum NormalArg {
case one(Int)
case two, three
}
let normalOne = Normal.one
let normalRawOne = NormalRaw.one
let normalArgOne = NormalArg.one(1)
if case .one = normalOne {
print("A normal one") //prints "A normal one"
}
if case .one = normalRawOne {
print("A normal \(normalRawOne.rawValue)") //prints "A normal 1"
}
if case .one(let value) = normalArgOne {
print("A normal \(value)") //prints "A normal 1"
}
关键是,在Swift中,如果您的枚举使用原始类型或没有关联的值,则只能免费获得枚举的等式(尝试一下,不能同时使用两者)。但是Swift不知道如何将个案与关联的值进行比较-我的意思是怎么可能?让我们来看这个例子:
Normal.one == .one //true
Normal.one == .two //false
NormalRaw.one == .one //true
NormalRaw.one == .two //false
NormalArg.one(1) == .one(1) //Well...?
NormalArg.one(2) == .one(1) //Well...?
NormalArg.one(1) == .two //Well...?
也许这样可以更清楚地说明为什么它不能开箱即用:
class Special {
var name: String?
var special: Special?
}
enum SpecialEnum {
case one(Special)
case two
}
var special1 = Special()
special1.name = "Hello"
var special2 = Special()
special2.name = "World"
special2.special = special1
SpecialEnum.one(special1) == SpecialEnum.one(special2) //Well...?
因此,如果您希望枚举具有关联的值,则必须自己在枚举中实现Equatable协议(protocol):
enum NormalArg: Equatable {
case one(Int)
case two
static func ==(lhs: NormalArg, rhs: NormalArg) -> Bool {
switch (lhs, rhs) {
case (let .one(a1), let .one(a2)):
return a1 == a2
case (.two,.two):
return true
default:
return false
}
}
}
关于swift - 如何对带有参数的枚举进行if-else比较,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/44061147/