原始类型'Bool'不能通过任何文字表达

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本身定义了九个文字表示:

  • ExpressibleByNilLiteral(nil)
  • ExpressibleByBooleanLiteral(false)
  • ExpressibleByArrayLiteral([])
  • ExpressibleByDictionaryLiteral([:])
  • ExpressibleByIntegerLiteral(0)
  • ExpressibleByFloatLiteral(0.0)
  • ExpressibleByUnicodeScalarLiteral("\u{0}")
  • ExpressibleByExtendedGraphemeClusterLiteral("\u{0}")
  • ExpressibleByStringLiteral("")

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)


Giu*_*lli 7

简化您的生活:

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 矩阵

  • 这并不使它与“@IBInspectable”兼容。因此,在这方面,接受的答案更有帮助。 (2认同)

Bal*_*Ben 5

我认为这没有必要。您可以创建一个普通的枚举,然后切换其大小写。此外,目前还不清楚TopBarStyle(rawValue: true)如果能够实现这一目标意味着什么。

我会根据需要使用var darkOnLight: Bool, 或enum TopBarStyle { /*cases*/ }并切换案例。


EvG*_*yin 5

我对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)