枚举案例的原始值必须是文字

时间:2015-05-19 12:01:44

标签: ios swift

我有这个枚举:

enum GestureDirection:UInt {
    case Up =       1 << 0
    case Down =     1 << 1
    case Left =     1 << 2
    case Right =    1 << 3
}

但在每一个案例中我都会收到错误:

  

枚举案例的原始值必须是文字

我不明白。

Swift 1.2,Xcode 6.3.2

4 个答案:

答案 0 :(得分:23)

那是因为1 << 0不是文字。您可以使用文字的二进制文字,并允许在那里:

enum GestureDirection:UInt {
    case Up =       0b000
    case Down =     0b001
    case Left =     0b010
    case Right =    0b100
}

Enums仅支持raw-value-literal numeric-literal(数字)string-literal­(字符串)或boolean-literal­(bool)language grammar。{/ p>

相反,作为一种解决方法,仍然可以很好地指示您正在做什么。

答案 1 :(得分:12)

对于不相互排斥的属性,我也建议 使用基于struct的{​​{1}}作为@Vincent建议。 一个优点是您可以免费获得所有位操作。

以下是一个完整的工作示例:

RawOptionSetType

用法:

struct GestureDirection : RawOptionSetType {
    let rawValue : UInt8
    init(rawValue: UInt8) {
        self.rawValue = rawValue
    }

    init(nilLiteral: ()) {
        self.rawValue = 0
    }
    static var allZeros: GestureDirection { return self(rawValue: 0) }

    static var Top:   GestureDirection { return self(rawValue: 1 << 0) }
    static var Down:  GestureDirection { return self(rawValue: 1 << 1) }
    static var Left:  GestureDirection { return self(rawValue: 1 << 2) }
    static var Right: GestureDirection { return self(rawValue: 1 << 3) }
}

Swift 2的更新:从Swift 2开始,这可以更简单 使用新的// Initialize: var direction : GestureDirection = .Top | .Right // Test: if (direction & .Top) != nil { // ... } // Add an option: direction |= .Left // Remove an option: direction &= ~(.Right) 协议,提供类似集合 界面(另请参阅最近添加的How to create NS_OPTIONS-style bitmask enumerations in Swift?答案)。

我们只需要定义底层存储类型和预定义值:

OptionSetType

用法:

struct GestureDirection : OptionSetType {
    let rawValue : UInt8

    static let Top   = GestureDirection(rawValue: 1 << 0)
    static let Down  = GestureDirection(rawValue: 1 << 1)
    static let Left  = GestureDirection(rawValue: 1 << 2)
    static let Right = GestureDirection(rawValue: 1 << 3)
}

答案 2 :(得分:5)

Swift 2.2版本: 在我的情况下,我需要转换字符串枚举值以在Localisable字符串中使用。所以在我的枚举中添加了这个方法。

    enum DisplayCellTitle: String {
    case Clear 

    func labelTitle() -> String {
        switch self {
        case .Clear:
            return "LBL_CLEAR".localizedWithComment("Clear")
        }
    }
}

然后像这样使用它:

        // Get the localised value of the Cell Label Title
    let lblTitle = DisplayCellTitle.labelTitle(cellTitle)()

传入的cellTitle只是其中一个CellTitle枚举值

答案 3 :(得分:4)

您似乎想要对您的枚举进行逐位支持,但如果您在Swift中考虑NS_OPTIONS Objective-C的翻译,则不是由Swift Enum表示,而是struct继承自RawOptionSetType 1}}。

如果您需要示例或说明,可以查看此NSHipster article

这可以通过以下方式完成:

struct UIViewAutoresizing : RawOptionSetType {
    init(_ value: UInt)
    var value: UInt
    static var None: UIViewAutoresizing { get }
    static var FlexibleLeftMargin: UIViewAutoresizing { get }
    static var FlexibleWidth: UIViewAutoresizing { get }
    static var FlexibleRightMargin: UIViewAutoresizing { get }
    static var FlexibleTopMargin: UIViewAutoresizing { get }
    static var FlexibleHeight: UIViewAutoresizing { get }
    static var FlexibleBottomMargin: UIViewAutoresizing { get }
}

此致