原始类型 'Bool' 不能用任何文字表达
Raw type 'Bool' is not expressible by any literal
我想让我的枚举很容易与 @IBInspectable
兼容,所以为了简单起见,我尝试用类型 Bool
:
来表示它
enum TopBarStyle: Bool {
case darkOnLight
case lightOnDark
}
但是 Xcode 给我:
Raw type 'Bool' is not expressible by any literal
这很奇怪,因为 true
和 false
似乎是用文字表达的完美候选者。
我还尝试添加 RawRepresentable
符合 Bool 类型:
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 (
""
)
但是 enum
原始表示 will apparently only accept natively 以数字 (0
-9
)、符号 (-
, +
) 或引用 ("
): 以上列表的最后五个协议。
在我看来,错误信息应该更具体一些。也许像这样明确的事情会很好:
Raw type 'Bool' is not expressible by any numeric or quoted-string literal
扩展 Bool 以符合这些协议之一仍然是可能的,例如:
extension Bool: ExpressibleByIntegerLiteral {
public init(integerLiteral value: Int) {
self = value != 0
}
}
这样做之后,这段代码现在可以正常构建了:
enum TopBarStyle: Bool {
case darkOnLight
case lightOnDark
}
@IBInspectable var style = TopBarStyle(rawValue: false)!
我认为没有必要。你可以做一个普通的枚举然后切换它的案例。此外,如果可以实现,TopBarStyle(rawValue: true)
意味着什么也完全不清楚。
我会使用 var darkOnLight: Bool
或 enum TopBarStyle { /*cases*/ }
并根据需要切换大小写。
我在 swift 上的解决方案 3
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
}
}
简化你的生活:
enum TopBarStyle {
case darkOnLight
case lightOnDark
var bool: Bool {
switch self {
case .darkOnLight:
return true
default:
return false
}
}
}
照常使用:
var current = TopBarStyle.darkOnLight
if current.bool {
// do this
} else {
// do that
}
您可以将案例扩展到更多,但它们是不可逆的,因为它是一个 N : 2 矩阵
我想让我的枚举很容易与 @IBInspectable
兼容,所以为了简单起见,我尝试用类型 Bool
:
enum TopBarStyle: Bool {
case darkOnLight
case lightOnDark
}
但是 Xcode 给我:
Raw type 'Bool' is not expressible by any literal
这很奇怪,因为 true
和 false
似乎是用文字表达的完美候选者。
我还尝试添加 RawRepresentable
符合 Bool 类型:
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 (
""
)
但是 enum
原始表示 will apparently only accept natively 以数字 (0
-9
)、符号 (-
, +
) 或引用 ("
): 以上列表的最后五个协议。
在我看来,错误信息应该更具体一些。也许像这样明确的事情会很好:
Raw type 'Bool' is not expressible by any numeric or quoted-string literal
扩展 Bool 以符合这些协议之一仍然是可能的,例如:
extension Bool: ExpressibleByIntegerLiteral {
public init(integerLiteral value: Int) {
self = value != 0
}
}
这样做之后,这段代码现在可以正常构建了:
enum TopBarStyle: Bool {
case darkOnLight
case lightOnDark
}
@IBInspectable var style = TopBarStyle(rawValue: false)!
我认为没有必要。你可以做一个普通的枚举然后切换它的案例。此外,如果可以实现,TopBarStyle(rawValue: true)
意味着什么也完全不清楚。
我会使用 var darkOnLight: Bool
或 enum TopBarStyle { /*cases*/ }
并根据需要切换大小写。
我在 swift 上的解决方案 3
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
}
}
简化你的生活:
enum TopBarStyle {
case darkOnLight
case lightOnDark
var bool: Bool {
switch self {
case .darkOnLight:
return true
default:
return false
}
}
}
照常使用:
var current = TopBarStyle.darkOnLight
if current.bool {
// do this
} else {
// do that
}
您可以将案例扩展到更多,但它们是不可逆的,因为它是一个 N : 2 矩阵