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

Raw type 'Bool' is not expressible by any literal

我想让我的枚举很容易与 @IBInspectable 兼容,所以为了简单起见,我尝试用类型 Bool:

来表示它
enum TopBarStyle: Bool {
    case darkOnLight
    case lightOnDark
}

但是 Xcode 给我:

Raw type 'Bool' is not expressible by any literal

这很奇怪,因为 truefalse 似乎是用文字表达的完美候选者。

我还尝试添加 RawRepresentable 符合 Bool 类型:

extension Bool: RawRepresentable {
    public init?(rawValue: Bool) {
        self = rawValue
    }
    public var rawValue: Bool {
        get { return self }
    }
}

但是并没有解决错误。

Swift 3 本身定义了这九个文字表示:

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

但是 enum 原始表示 will apparently only accept natively 以数字 (0-9)、符号 (- , +) 或引用 ("): 以上列表的最后五个协议。

在我看来,错误信息应该更具体一些。也许像这样明确的事情会很好:

Raw type 'Bool' is not expressible by any numeric or quoted-string literal

扩展 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: Boolenum 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 矩阵