原始类型' Bool'任何文字都无法表达

时间:2017-02-17 07:44:34

标签: swift enums rawrepresentable

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

enum TopBarStyle: Bool {
    case darkOnLight
    case lightOnDark
}

但是Xcode给了我:

  

Raw type' Bool'任何字面都不能表达

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

我还试图将RawRepresentable一致性添加到Bool类型中:

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

但它并没有解决错误。

4 个答案:

答案 0 :(得分:9)

Swift 3本身定义了九个文字表示:

  • ExpressibleByNilLiteral(nil
  • ExpressibleByBooleanLiteral(false
  • ExpressibleByArrayLiteral([]
  • ExpressibleByDictionaryLiteral([:]
  • ExpressibleByIntegerLiteral(0
  • ExpressibleByFloatLiteral(0.0
  • ExpressibleByUnicodeScalarLiteral("\u{0}"
  • ExpressibleByExtendedGraphemeClusterLiteral("\u{0}"
  • ExpressibleByStringLiteral(""

但是enum原始代表will apparently only accept natively以数字(0 - 9)开头的那些代表的子集,一个符号(-,{ {1}})或引用(+):上面列表的最后五个协议。

在我看来,错误信息应该更具体。也许这样明确的东西本来不错:

  

原始类型'Bool'不能通过任何数字或引用字符串文字表达

仍然可以扩展Bool以符合其中一个协议,例如:

"

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

extension Bool: ExpressibleByIntegerLiteral {
    public init(integerLiteral value: Int) {
        self = value != 0
    }
}

答案 1 :(得分:4)

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

答案 2 :(得分:2)

我认为这不是必要的。你可以只做一个正常的枚举,然后切换它的情况。此外,如果能够实现这一目标,TopBarStyle(rawValue: true)意味着什么并不清楚。

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

答案 3 :(得分:1)

简化生活:

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矩阵,它们是不可逆的