Swift 原始类型';布尔';不能用任何文字来表达
我想让我的枚举易于与Swift 原始类型';布尔';不能用任何文字来表达,swift,enums,rawrepresentable,Swift,Enums,Rawrepresentable,我想让我的枚举易于与@IBInspectable兼容,因此为了简单起见,我尝试使用类型Bool表示它: enum TopBarStyle: Bool { case darkOnLight case lightOnDark } 但是Xcode给了我: 原始类型“Bool”不能用任何文字表示 这很奇怪,因为true和false似乎是文字表达的完美候选 我还尝试将RawRepresentable符合性添加到类型Bool中,包括: extension Bool: RawRepresen
@IBInspectable
兼容,因此为了简单起见,我尝试使用类型Bool
表示它:
enum TopBarStyle: Bool {
case darkOnLight
case lightOnDark
}
但是Xcode给了我:
原始类型“Bool”不能用任何文字表示
这很奇怪,因为true
和false
似乎是文字表达的完美候选
我还尝试将RawRepresentable
符合性添加到类型Bool中,包括:
extension Bool: RawRepresentable {
public init?(rawValue: Bool) {
self = rawValue
}
public var rawValue: Bool {
get { return self }
}
}
但是它并没有解决这个错误。Swift 3本机定义了这九种文字表示:
- ExpressibleByNilLiteral(
)nil
- expressibleBooleanLiteral(
)false
- ExpressibleByArrayLiteral(
)[]
- ExpressibleByDictionaryLiteral(
)[:]
- ExpressibleByIntegerLiteral(
)0
- ExpressibleByFloatLiteral(
)0.0
- ExpressibleByUnicodeScalarLiteral(
)“\u{0}”
- expressibleByExtendedGraphMeClusterLiteral(
)“\u{0}”
- ExpressibleByStringLiteral(
)“”
enum
原始表示以数字(0
-9
)、符号(-
、+
)或引号(“
)开头的那些表示的子集:上述列表的最后五个协议
在我看来,错误信息应该更具体。也许像这样明确的信息会更好:
原始类型“Bool”不能由任何数字或带引号的字符串文字表示
扩展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矩阵。文档非常清楚::“原始值可以是字符串、字符或任何整数或浮点数类型。您可以通过在枚举上添加计算的
var boolValue
来实现相同的效果。要添加到@MartinR的注释中,true
和false
不是文字;它们更接近常量(名称由编译器保留的常量)。文字是编译器有某种魔力可以转换为内部值的东西。理解真
和假
并不需要魔法,因为它们是关键词。有趣。因此,扩展Bool:rawrrepresentable
+枚举数据类型:Bool
不起作用,但是直接的枚举数据类型:rawrrepresentable
将起作用。请注意,这里不需要类型别名
。这并不意味着它与@IBInspectable
兼容。因此,在这方面,公认的答案更有帮助。