Cœu*_*œur 7 enums swift rawrepresentable
我想让我的枚举容易兼容@IBInspectable,所以为了简单起见,我试着用类型表示它Bool:
enum TopBarStyle: Bool {
case darkOnLight
case lightOnDark
}
Run Code Online (Sandbox Code Playgroud)
但是Xcode给了我:
原始类型'Bool'不能通过任何文字表达
这很奇怪,因为true并且false似乎是文字表达的完美候选人.
我还尝试将RawRepresentable类型添加到Bool类型:
extension Bool: RawRepresentable {
public init?(rawValue: Bool) {
self = rawValue
}
public var rawValue: Bool {
get { return self }
}
}
Run Code Online (Sandbox Code Playgroud)
但它没有解决错误.
Cœu*_*œur 11
Swift 3本身定义了九个文字表示:
nil)false)[])[:])0)0.0)"\u{0}")"\u{0}")"")但enum原始表示显然只接受以数字(0- 9),符号(-,+)或引号(")开头的那些代表的子集:上面列表的最后五个协议.
在我看来,错误信息应该更具体.也许像这样明确的东西会很好:
原始类型'Bool'不能由任何数字或带引号的字符串表示
仍然可以扩展Bool以符合其中一个协议,例如:
extension Bool: ExpressibleByIntegerLiteral {
public init(integerLiteral value: Int) {
self = value != 0
}
}
Run Code Online (Sandbox Code Playgroud)
在这样做之后,这段代码现在构建良好:
enum TopBarStyle: Bool {
case darkOnLight
case lightOnDark
}
@IBInspectable var style = TopBarStyle(rawValue: false)!
Run Code Online (Sandbox Code Playgroud)
简化您的生活:
enum TopBarStyle {
case darkOnLight
case lightOnDark
var bool: Bool {
switch self {
case .darkOnLight:
return true
default:
return false
}
}
}
Run Code Online (Sandbox Code Playgroud)
像往常一样使用:
var current = TopBarStyle.darkOnLight
if current.bool {
// do this
} else {
// do that
}
Run Code Online (Sandbox Code Playgroud)
您可以将情况扩展到更多,但它们是不可逆的,因为它是 N : 2 矩阵
我认为这没有必要。您可以创建一个普通的枚举,然后切换其大小写。此外,目前还不清楚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
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
5346 次 |
| 最近记录: |