我有这个枚举:
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
答案 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 }
}
此致