在阅读了如何用关联值测试Swift枚举的相等性之后,我实现了以下枚举:
enum CardRank {
case Number(Int)
case Jack
case Queen
case King
case Ace
}
func ==(a: CardRank, b: CardRank) -> Bool {
switch (a, b) {
case (.Number(let a), .Number(let b)) where a == b: return true
case (.Jack, .Jack): return true
case (.Queen, .Queen): return true
case (.King, .King): return true
case (.Ace, .Ace): return true
default: return false
}
}
以下代码有效:
let card: CardRank = CardRank.Jack
if card == CardRank.Jack {
print("You played a jack!")
} else if card == CardRank.Number(2) {
print("A two cannot be played at this time.")
}
但是,这不能编译:
let number = CardRank.Number(5)
if number == CardRank.Number {
print("You must play a face card!")
}
…,并显示以下错误消息:
二进制运算符’==’不能应用于类型’CardRank’和’(Int)-> CardRank’的操作数
我假设这是因为它期望使用完整类型,CardRank.Number
而不指定整个类型,而CardRank.Number(2)
确实指定了。但是,在这种情况下,我希望它匹配
任何 数字。不只是一个特定的
显然,我可以使用switch语句,但是实现==
运算符的全部目的是避免这种冗长的解决方案:
switch number {
case .Number:
print("You must play a face card!")
default:
break
}
有什么方法可以将枚举与关联值进行比较,而忽略其关联值?
注意: 我意识到我可以将==
方法中的大小写更改为case (.Number, .Number): return true
,但是尽管它可以正确返回true,但我的比较仍然看起来像是将其与特定数字(number == CardRank.Number(2)
;其中2是虚拟值)而不是 任何 数字进行比较(number == CardRank.Number
)。
编辑: 正如Etan所指出的,您可以省略(_)
通配符匹配以更简洁地使用它。
不幸的是,我不认为有比switch
Swift 1.2中的方法更简单的方法。
但是,在Swift 2中,您可以使用新的if-case
模式匹配:
let number = CardRank.Number(5)
if case .Number(_) = number {
// Is a number
} else {
// Something else
}
如果您要避免冗长,则可以考虑将isNumber
枚举属性添加到实现switch语句的枚举中。
问题内容: 我得到编译器错误指向以下语句: 二进制运算符’==’不能应用于两个’MyClass.MyEnum’操作数 相反,如果我使用一条语句,则没有问题: 但是,该语句感觉太冗长:我只想要for ,否则就什么也没有。一种说法更有意义。 枚举和怎么回事? 编辑: 这是很奇怪。确定版本并转到代码的其他(完全不相关)部分,然后返回后,-statement版本(将force- unwrapped属性与固
问题内容: 我想测试两个Swift枚举值的相等性。例如: 但是,编译器不会编译相等表达式: 我是否定义了自己的等于运算符的重载?我希望Swift编译器能够自动处理它,就像Scala和Ocaml一样。 问题答案: 正如@jedwid有用地指出的那样,从Swift 4.1开始(由于SE-0185,Swift还支持合成以及具有关联值的枚举。 因此,如果您使用的是Swift 4.1或更高版本,则以下内容将
本文向大家介绍深入探究Swift枚举关联值的内存,包括了深入探究Swift枚举关联值的内存的使用技巧和注意事项,需要的朋友参考一下 这是枚举最基础的用法,但是在swift中,对枚举的功能进行了加强,也就是关联值。 关联值可以将额外信息附加到 enum case中,像下面这样子。 我们可以看到,在我们创建一个枚举值t的时候,设置他的选项为test1,同时可以关联3个Int类型的值,然后在switch
问题内容: tl; dr 是否可以实例化具有类型关联值的通用Swift 4枚举成员? 背景 我正在使用一个简单的 Result 枚举(类似于典型的Result): 现在,我想使用这个枚举来表示操作的结果,该操作不会产生实际的结果值;该操作是 成功 还是 失败 。为此,我将类型定义为,但是我在如何创建Result实例方面苦苦挣扎,这都不可行。 问题答案: 在Swift 3中,您可以省略type的关联
问题内容: 以前,我将LegNo枚举定义为: 通过调用,我可以获得与每个枚举关联的值。 但是现在我决定让枚举是int -1而不是0,所以我决定使用私有构造函数进行初始化并设置其int值 现在唯一的事情就是因为我这样做,所以该方法不适用于枚举。我如何获得与int相关联的枚举?除了使用case switch语句或if-elseif-elseif之外,还有其他有效的方法吗? 我可以看到很多与从枚举获取i
以前,我将LegNo枚举简单定义为: 通过调用,我能够获得与每个枚举关联的值。 现在唯一的问题是,因为我是这样做的,方法将不能用于枚举。如何获得与int关联的枚举?除了使用case switch语句或if-elseif-elseif之外,是否还有其他有效的方法来完成此操作 我可以看到很多关于从枚举中获得int值的问题,但我想要的是相反的问题。