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



我想让我的枚举很容易与@IBInspectable兼容,因此为了简单起见,我试图用类型Bool

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

但是Xcode给了我:

原始类型的'bool'不可用任何字面的

表达

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

我还尝试添加RawRepresentable符合:

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

但没有解决错误。

swift 3内定义了那些九个文字表示:

  • expressiblenilliteral( nil
  • expressiblebybooleanliteral( false
  • expressibleByArrayliteral([]
  • expressibledictionaryliteral( [:]
  • expressiblebyIntegerliteral( 0
  • expressiblebyfloatliteral( 0.0
  • expressibleByunicodescalliteral("u{0}"
  • ExpressibleByextendedGrapheMeclusterLiteral("u{0}"
  • ExpressibleBystringLiteral(""

但是enum原始表示形式显然只能接受以数字开头(0 -9),符号(-+)或引用(")的代表的子集:上述列表的最后五个协议。

我认为,错误消息应该更具体。也许这样的明确的东西会很好:

原始类型的'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)!

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

,它们不是可逆的

我认为这不是必需的。您只需做一个普通的枚举,然后切换其案例。另外,目前尚不清楚TopBarStyle(rawValue: true)是否可以实现这一点。

我将使用var darkOnLight: Boolenum TopBarStyle { /*cases*/ }并根据需要切换。

在Swift 5中工作示例:

public enum MyBoolEnum: CaseIterable, RawRepresentable {
    case yes
    case no
    public init?(rawValue: Bool) {
        self = rawValue ? .yes : .no
    }
    public var rawValue: RawValue {
        switch self {
        case .yes:
            return true
        case .no:
            return false
        }
    }
}

相关内容

最新更新