Необработанный тип '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
}
}
}