我想让我的枚举很容易与@IBInspectable
兼容,所以为了简单起见,我尝试使用Bool
类型来表示它:
enum TopBarStyle: Bool {
case darkOnLight
case lightOnDark
}
但是Xcode给了我:
Raw type' Bool'任何字面都不能表达
这很奇怪,因为true
和false
似乎是文字表达的完美候选人。
我还试图将RawRepresentable
一致性添加到Bool类型中:
extension Bool: RawRepresentable {
public init?(rawValue: Bool) {
self = rawValue
}
public var rawValue: Bool {
get { return self }
}
}
但它并没有解决错误。
答案 0 :(得分:9)
Swift 3本身定义了九个文字表示:
nil
)false
)[]
)[:]
)0
)0.0
)"\u{0}"
)"\u{0}"
)""
)但是enum
原始代表will apparently only accept natively以数字(0
- 9
)开头的那些代表的子集,一个符号(-
,{ {1}})或引用(+
):上面列表的最后五个协议。
在我看来,错误信息应该更具体。也许这样明确的东西本来不错:
原始类型'Bool'不能通过任何数字或引用字符串文字表达
仍然可以扩展Bool以符合其中一个协议,例如:
"
在这样做之后,这段代码现在构建得很好:
extension Bool: ExpressibleByIntegerLiteral {
public init(integerLiteral value: Int) {
self = value != 0
}
}
答案 1 :(得分:4)
我在swift 3上的解决方案
enum DataType: RawRepresentable {
case given
case recieved
typealias RawValue = Bool
var rawValue: RawValue {
return self == .given ? true : false
}
init?(rawValue: RawValue) {
self = rawValue == true ? .given : .recieved
}
}
答案 2 :(得分:2)
我认为这不是必要的。你可以只做一个正常的枚举,然后切换它的情况。此外,如果能够实现这一目标,TopBarStyle(rawValue: true)
意味着什么并不清楚。
我会使用var darkOnLight: Bool
或enum TopBarStyle { /*cases*/ }
并根据需要切换案例。
答案 3 :(得分:1)
简化生活:
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矩阵,它们是不可逆的