12

我想让我的枚举很容易兼容@IBInspectable,所以为了简单起见,我试图让它用 type 表示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 }
    }
}

但它并没有解决错误。

4

4 回答 4

15

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
    }
}

这样做之后,这段代码现在构建得很好:

enum TopBarStyle: Bool {
    case darkOnLight
    case lightOnDark
}

@IBInspectable var style = TopBarStyle(rawValue: false)!
于 2017-02-17T10:35:03.840 回答
13

我在 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
    }
}
于 2017-07-21T20:10:26.263 回答
4

我不认为这是必要的。你可以只做一个普通的枚举,然后切换它的案例。此外,完全不清楚TopBarStyle(rawValue: true)如果可以实现这一点意味着什么。

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

于 2017-02-26T05:08:00.887 回答
3

简化您的生活:

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

于 2019-04-21T10:14:29.990 回答