我如何告诉它我希望两个案例具有相同的值?
我将证明这对于所有 Swift 版本都是可能的
这不是解决方法。这实际上是可能的。尽管他们说不是。
这确实回答了你的问题:
enum Foo: Bool {
case bar = 0
case bas = 1
case bat = 2
}
// THIS IS THE KEY!!
extension Bool: ExpressibleByIntegerLiteral {
public init(integerLiteral value: Int) { self = true }
}
func bug() {
assert(Foo.bar == Foo.bas) // This assertion is legitimate!
assert(Foo.bar.rawValue == Foo.bas.rawValue) // This assertion is legitimate!
}
令人难以置信的是,枚举 Foo 上的所有案例都有一个原始值 true。您绝对可以重新调整它以支持更多的重复类型,而不仅仅是 Bool。
想象一下所有的影响.. Set、Dictionary、switch 语句、CaseIterable 等。
我想我必须在 bugs.swift.org 中提交一个 Swift Radar...或者我们可以保守这个小秘密
您可以关注SR-13212 以获取有关此错误修复的更新。
编辑: - 他们将其保留为一项功能。
答案
您提到您想要一个原始值为0, 0, and 1 的枚举。在这里!
enum Bar: Int {
case A = "0"
case B = "0 "
case C = "1"
}
extension Int: ExpressibleByStringLiteral {
public init(stringLiteral elements: String) {
self = Int(String(elements.first ?? Character("0"))) ?? 0
}
}
此扩展获取每个 String 的第一个字符并将其转换为 Int。因此,使原始值真正 0, 0, and 1。
真实陈述:Bar.A == Bar.B
它目前适用于所有 Swift 版本。
编辑:异常
这里有另一个提示,为什么我认为这是一个错误。 Double 符合 ExpressibleByIntegerLiteral。但是,这段代码不会编译:
enum Foo: Double {
case a = 1.0
case b = 1
}
并试图覆盖它会导致此错误:
- 警告:
Double 与协议ExpressibleByIntegerLiteral 的一致性已在类型模块Swift 中说明
Swift 工程师以某种方式阻止了这一点,但其他一切都很好。