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

Arb*_*tur 25 ios swift

我有这个枚举:

enum GestureDirection:UInt {
    case Up =       1 << 0
    case Down =     1 << 1
    case Left =     1 << 2
    case Right =    1 << 3
}
Run Code Online (Sandbox Code Playgroud)

但在每种情况下我都会收到错误:

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

我不懂.

Swift 1.2,Xcode 6.3.2

Ben*_*aum 24

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

enum GestureDirection:UInt {
    case Up =       0b000
    case Down =     0b001
    case Left =     0b010
    case Right =    0b100
}
Run Code Online (Sandbox Code Playgroud)

枚举只支持raw-value-literalS的要么是numeric-literal(数字)string-literal­(字符串)或boolean-literal­每(布尔)语言的语法.

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

  • 它不支持任何操作.它仅支持文字.(1 + 5)也不起作用 (2认同)

Mar*_*n R 13

对于不相互排斥的属性,我还建议使用struct基于RawOptionSetType@Vincent的建议.一个优点是您可以免费获得所有位操作.

这是一个完整的工作示例:

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) }
}
Run Code Online (Sandbox Code Playgroud)

用法:

// Initialize:
var direction : GestureDirection = .Top | .Right

// Test:
if (direction & .Top) != nil {
   // ...
}

// Add an option:
direction |= .Left

// Remove an option:
direction &= ~(.Right)
Run Code Online (Sandbox Code Playgroud)

更新Swift 2:从Swift 2开始,使用新OptionSetType协议可以更简单地完成,它提供了一个类似于集合的接口(另请参阅最近添加的如何在Swift中创建NS_OPTIONS样式位掩码枚举的答案).

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

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)
}
Run Code Online (Sandbox Code Playgroud)

用法:

// Initialize:
var direction : GestureDirection = [ .Top, .Right ]

// Test:
if direction.contains(.Top) {
    // ...
}

// Add an option:
direction.insert(.Left)

// Remove an option:
direction.remove(.Right)
Run Code Online (Sandbox Code Playgroud)


ioo*_*opl 7

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

    enum DisplayCellTitle: String {
    case Clear 

    func labelTitle() -> String {
        switch self {
        case .Clear:
            return "LBL_CLEAR".localizedWithComment("Clear")
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

然后像这样使用它:

        // Get the localised value of the Cell Label Title
    let lblTitle = DisplayCellTitle.labelTitle(cellTitle)()
Run Code Online (Sandbox Code Playgroud)

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


Vin*_*zzo 5

您似乎希望为您的枚举提供按位支持,但如果您考虑 Swift 中的 Objective-C 翻译NS_OPTIONS,那么它不是由 Swift 枚举表示,而是structRawOptionSetType.

如果您需要示例或说明,可以查看这篇NSHipster 文章

这可以通过这样的事情来完成:

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 }
}
Run Code Online (Sandbox Code Playgroud)

问候,