Początkowa wartość przypadku wyliczenia musi być literałem


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

Ale w każdym przypadku pojawia się błąd:

Początkowa wartość przypadku wyliczenia musi być literałem

Nie rozumiem.
Swift 1.2, Xcode 6.3.2
Zaproszony:
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

Dzieje się tak, ponieważ
1 & < & < 0
nie jest dosłowne. Możesz użyć literału binarnego, który jest literałem i jest tam dozwolony:
enum GestureDirection:UInt {
case Up = 0b000
case Down = 0b001
case Left = 0b010
case Right = 0b100
}

Enums obsługuje tylko
surowe-literały-wartości
, które są albo
numeric-literal
(liczba)
string-literal
(ciągi), albo
boolean-literal
(bool) dla

język gramatyczny
https://developer.apple.com/li ... ID351
.
Zamiast tego, jako obejście i nadal daj dobry obraz tego, co robisz.
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

W przypadku atrybutów, które nie wykluczają się wzajemnie, polecam również
użyj
struct
w oparciu o
RawOptionSetType
zgodnie z sugestią @Vincent.
Jedną z zalet jest to, że wszystkie operacje na bitach są dostępne za darmo.
Oto kompletny przykład roboczy:
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) }
}

Za pomocą:
// Initialize:
var direction : GestureDirection = .Top | .Right// Test:
if (direction & .Top) != nil {
// ...
}// Add an option:
direction |= .Left// Remove an option:
direction &= ~(.Right)


Aktualizacja dla Swift 2:

od wersji Swift 2 można to zrobić łatwiej
używając nowego protokołu
OptionSetType
, który oferuje
interfejs podobny do zestawu (zobacz też ostatnio dodane odpowiedzi na pytanie,

Jak utworzyć wyliczenia maski bitowej w stylu NS_OPTIONS w języku Swift?
https://coderoad.ru/24066170/
).
Musimy tylko zdefiniować podstawowy typ pamięci i predefiniowane wartości:
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)
}

Za pomocą:
// Initialize:
var direction : GestureDirection = [ .Top, .Right ]// Test:
if direction.contains(.Top) {
// ...
}// Add an option:
direction.insert(.Left)// Remove an option:
direction.remove(.Right)
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

Wersja Swift 2.2:
W moim przypadku musiałem przekonwertować wartości wyliczenia ciągów do użycia w lokalizowalnych ciągach. Więc dodałem tę metodę do mojego wyliczenia.
enum DisplayCellTitle: String {
case Clear func labelTitle() -> String {
switch self {
case .Clear:
return "LBL_CLEAR".localizedWithComment("Clear")
}
}
}

A potem użyj tego w ten sposób:
// Get the localised value of the Cell Label Title
let lblTitle = DisplayCellTitle.labelTitle(cellTitle)()

gdzie przekazany cellTitle jest tylko jedną z tych wartości wyliczenia CellTitle
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

Wygląda na to, że potrzebujesz obsługi bitowej dla swoich wyliczeń, ale jeśli chcesz przetłumaczyć
NS_OPTIONS
Objective-C na Swift, to nie będzie to reprezentowane przez wyliczenie Swift, ale
struct
dziedziczy po
RawOptionSetType
.
Jeśli potrzebujesz przykładu lub instrukcji, możesz się temu przyjrzeć

Artykuł NSHipster
http://nshipster.com/rawoptionsettype/
Można to zrobić za pomocą czegoś takiego:
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 }
}

Z poważaniem

Aby odpowiedzieć na pytania, Zaloguj się lub Zarejestruj się