我想让我的枚举很容易与@IBInspectable
兼容,因此为了简单起见,我试图用类型Bool
:
enum TopBarStyle: Bool {
case darkOnLight
case lightOnDark
}
但是Xcode给了我:
原始类型的'bool'不可用任何字面的
表达
这很奇怪,因为 true
和 false
似乎是文字表达的完美候选者。
我还尝试添加RawRepresentable
符合:
extension Bool: RawRepresentable {
public init?(rawValue: Bool) {
self = rawValue
}
public var rawValue: Bool {
get { return self }
}
}
但没有解决错误。
swift 3内定义了那些九个文字表示:
- expressiblenilliteral(
nil
) - expressiblebybooleanliteral(
false
) - expressibleByArrayliteral(
[]
) - expressibledictionaryliteral(
[:]
) - expressiblebyIntegerliteral(
0
) - expressiblebyfloatliteral(
0.0
) - expressibleByunicodescalliteral(
"u{0}"
) - ExpressibleByextendedGrapheMeclusterLiteral(
"u{0}"
) - ExpressibleBystringLiteral(
""
)
但是enum
原始表示形式显然只能接受以数字开头(0
-9
),符号(-
,+
)或引用("
)的代表的子集:上述列表的最后五个协议。
我认为,错误消息应该更具体。也许这样的明确的东西会很好:
原始类型的'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)!
我在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矩阵
我认为这不是必需的。您只需做一个普通的枚举,然后切换其案例。另外,目前尚不清楚TopBarStyle(rawValue: true)
是否可以实现这一点。
我将使用var darkOnLight: Bool
或enum TopBarStyle { /*cases*/ }
并根据需要切换。
在Swift 5中工作示例:
public enum MyBoolEnum: CaseIterable, RawRepresentable {
case yes
case no
public init?(rawValue: Bool) {
self = rawValue ? .yes : .no
}
public var rawValue: RawValue {
switch self {
case .yes:
return true
case .no:
return false
}
}
}