Swift 原始类型';布尔';不能用任何文字来表达

Swift 原始类型';布尔';不能用任何文字来表达,swift,enums,rawrepresentable,Swift,Enums,Rawrepresentable,我想让我的枚举易于与@IBInspectable兼容,因此为了简单起见,我尝试使用类型Bool表示它: enum TopBarStyle: Bool { case darkOnLight case lightOnDark } 但是Xcode给了我: 原始类型“Bool”不能用任何文字表示 这很奇怪,因为true和false似乎是文字表达的完美候选 我还尝试将RawRepresentable符合性添加到类型Bool中,包括: extension Bool: RawRepresen

我想让我的枚举易于与
@IBInspectable
兼容,因此为了简单起见,我尝试使用类型
Bool
表示它:

enum TopBarStyle: Bool {
    case darkOnLight
    case lightOnDark
}
但是Xcode给了我:

原始类型“Bool”不能用任何文字表示

这很奇怪,因为
true
false
似乎是文字表达的完美候选

我还尝试将
RawRepresentable
符合性添加到类型Bool中,包括:

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

但是它并没有解决这个错误。

Swift 3本机定义了这九种文字表示:

  • ExpressibleByNilLiteral(
    nil
  • expressibleBooleanLiteral(
    false
  • ExpressibleByArrayLiteral(
    []
  • ExpressibleByDictionaryLiteral(
    [:]
  • ExpressibleByIntegerLiteral(
    0
  • ExpressibleByFloatLiteral(
    0.0
  • ExpressibleByUnicodeScalarLiteral(
    “\u{0}”
  • expressibleByExtendedGraphMeClusterLiteral(
    “\u{0}”
  • ExpressibleByStringLiteral(
    “”
但是
enum
原始表示以数字(
0
-
9
)、符号(
-
+
)或引号(
)开头的那些表示的子集:上述列表的最后五个协议

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

原始类型“Bool”不能由任何数字或带引号的字符串文字表示

扩展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: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
    }
}
简化你的生活:

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

文档非常清楚::“原始值可以是字符串、字符或任何整数或浮点数类型。您可以通过在枚举上添加计算的
var boolValue
来实现相同的效果。要添加到@MartinR的注释中,
true
false
不是文字;它们更接近常量(名称由编译器保留的常量)。文字是编译器有某种魔力可以转换为内部值的东西。理解
并不需要魔法,因为它们是关键词。有趣。因此,
扩展Bool:rawrrepresentable
+
枚举数据类型:Bool
不起作用,但是直接的
枚举数据类型:rawrrepresentable
将起作用。请注意,这里不需要
类型别名
。这并不意味着它与
@IBInspectable
兼容。因此,在这方面,公认的答案更有帮助。