Необработанный тип 'Bool' не выражается никаким литералом

Я хочу, чтобы мои перечисления были легко совместимы с @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 }
    }
}

Но это не решило ошибку.

5 ответов

Решение

Я не думаю, что это необходимо. Вы можете просто сделать нормальный enum и затем переключить его регистры. Кроме того, не совсем понятно, что TopBarStyle(rawValue: true) будет означать, если это может быть достигнуто.

Я бы либо использовал var darkOnLight: Bool, или же enum TopBarStyle { /*cases*/ } и переключать дела по мере необходимости.

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)!

Мое решение на swift 3

enum DataType: RawRepresentable {
    case given
    case recieved

    typealias RawValue = Bool
    var rawValue: RawValue {
        return self == .given ? true : false
    }
    init?(rawValue: RawValue) {
        self = rawValue == true ? .given : .recieved
    }
}

Упростите свою жизнь:

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

Рабочий пример в 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
        }
    }
}
Другие вопросы по тегам