Raw type 'Bool' is not expressible by any literal
我想让我的枚举与
表示
1 2 3 4 | enum TopBarStyle: Bool { case darkOnLight case lightOnDark } |
但是 Xcode 给了我:
Raw type 'Bool' is not expressible by any literal
这很奇怪,因为
我还尝试将
1 2 3 4 5 6 7 8 | extension Bool: RawRepresentable { public init?(rawValue: Bool) { self = rawValue } public var rawValue: Bool { get { return self } } } |
但它并没有解决错误。
Swift 3 原生定义了这九种文字表示:
-
ExpressibleByNilLiteral (
nil ) -
ExpressibleByBooleanLiteral (
false ) -
ExpressibleByArrayLiteral (
[] ) -
ExpressibleByDictionaryLiteral (
[:] ) -
ExpressibleByIntegerLiteral (
0 ) -
ExpressibleByFloatLiteral (
0.0 ) -
ExpressibleByUnicodeScalarLiteral (
"\\u{0}" ) -
ExpressibleByExtendedGraphemeClusterLiteral (
"\\u{0}" ) -
ExpressibleByStringLiteral (
"" )
但
在我看来,错误信息应该更具体。也许像这样明确的东西会很好:
Raw type 'Bool' is not expressible by any numeric or quoted-string literal
扩展 Bool 以符合其中一种协议仍然是可能的,例如:
1 2 3 4 5 | extension Bool: ExpressibleByIntegerLiteral { public init(integerLiteral value: Int) { self = value != 0 } } |
在这样做之后,这段代码现在构建得很好:
1 2 3 4 5 6 | enum TopBarStyle: Bool { case darkOnLight case lightOnDark } @IBInspectable var style = TopBarStyle(rawValue: false)! |
我在 swift 3 上的解决方案
1 2 3 4 5 6 7 8 9 10 11 12 | enum DataType: RawRepresentable { case given case received typealias RawValue = Bool var rawValue: RawValue { return self == .given ? true : false } init?(rawValue: RawValue) { self = rawValue == true ? .given : .received } } |
我不认为这是必要的。你可以只做一个普通的枚举,然后切换它的案例。此外,完全不清楚
我会使用
简化你的生活:
1 2 3 4 5 6 7 8 9 10 11 12 13 | enum TopBarStyle { case darkOnLight case lightOnDark var bool: Bool { switch self { case .darkOnLight: return true default: return false } } } |
照常使用:
1 2 3 4 5 6 7 | var current = TopBarStyle.darkOnLight if current.bool { // do this } else { // do that } |
您可以将案例扩展到更多,但它们是不可逆的,因为它是一个 N : 2 矩阵