我有这个枚举:
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每(布尔)语言的语法.
相反,作为一种解决方法,仍然可以很好地指示您正在做什么.
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)
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枚举值
您似乎希望为您的枚举提供按位支持,但如果您考虑 Swift 中的 Objective-C 翻译NS_OPTIONS,那么它不是由 Swift 枚举表示,而是struct从RawOptionSetType.
如果您需要示例或说明,可以查看这篇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)
问候,
| 归档时间: |
|
| 查看次数: |
18245 次 |
| 最近记录: |