In der Dokumentation von Apple zur Interaktion mit C-APIs wird beschrieben, wie NS_ENUM
markierte C-Aufzählungen als Swift-Aufzählungen importiert werden. Dies ist sinnvoll, und da Aufzählungen in Swift leicht als Werttyp bereitgestellt enum
werden können, ist es leicht zu erkennen, wie wir unsere eigenen erstellen.
Weiter unten steht NS_OPTIONS
Folgendes über markierte Optionen im C-Stil:
Swift importiert auch Optionen, die mit dem
NS_OPTIONS
Makro markiert sind . Während der Optionen für importierte Aufzählungen ähnlich verhalten, können die Optionen auch einige bitweise Operationen, wie zum Beispiel unterstützen&
,|
und~
. In Objective-C stellen Sie einen leeren Optionssatz mit der Konstanten Null (0
) dar. Verwenden Sienil
in Swift, um das Fehlen von Optionen darzustellen.
options
Wie können wir eine C-Style-Optionsvariable erstellen, mit der wir arbeiten können , da es in Swift keinen Wertetyp gibt ?
quelle
RawOptionsSetType
: nshipster.com/rawoptionsettypeAntworten:
Swift 3.0
Fast identisch mit Swift 2.0. OptionSetType wurde in OptionSet umbenannt und Aufzählungen werden gemäß Konvention in Kleinbuchstaben geschrieben.
Anstatt eine
none
Option bereitzustellen, empfiehlt Swift 3, einfach ein leeres Array-Literal zu verwenden:Andere Verwendung:
Swift 2.0
In Swift 2.0 kümmern sich Protokollerweiterungen um den größten Teil der Boilerplate für diese, die jetzt als konforme Struktur importiert werden
OptionSetType
. (RawOptionSetType
ist ab Swift 2 Beta 2 verschwunden.) Die Deklaration ist viel einfacher:Jetzt können wir die satzbasierte Semantik verwenden mit
MyOptions
:Swift 1.2
Mit Blick auf den Objective-C - Optionen , die von Swift importiert wurden (
UIViewAutoresizing
zum Beispiel), können wir sehen , dass die Optionen deklarieren sind alsstruct
dass Konform ProtokollRawOptionSetType
, was wiederum Konform_RawOptionSetType
,Equatable
,RawRepresentable
,BitwiseOperationsType
, undNilLiteralConvertible
. Wir können unsere eigenen so erstellen:Jetzt können wir diesen neuen Optionssatz
MyOptions
wie in der Apple-Dokumentation beschrieben behandeln: Sie können eineenum
ähnliche Syntax verwenden:Und es verhält sich auch so, als würden wir erwarten, dass sich Optionen verhalten:
Ich habe einen Generator gebaut, um ein Swift-Optionsset ohne das Suchen / Ersetzen zu erstellen .
Neueste: Änderungen für Swift 1.1 Beta 3.
quelle
value
eine gemachtUInt32
. Sie müssen auch keine der Funktionen definieren, relevante Funktionen sind bereits fürRawOptionSet
s (z. B.func |<T : RawOptionSet>(a: T, b: T) -> T
) definiertUInt
? Es funktioniert gut für mich.enum CollisionTypes: UInt32 { case Player = 1 case Wall = 2 case Star = 4 case Vortex = 8 case Finish = 16 }
Xcode 6.1 Beta 2 brachte einige Änderungen am
RawOptionSetType
Protokoll (siehe diesen Airspeedvelocity-Blogeintrag und die Apple-Versionshinweise ).Basierend auf dem Beispiel von Nate Cooks ist hier eine aktualisierte Lösung. Sie können Ihren eigenen Optionssatz folgendermaßen definieren:
Es kann dann folgendermaßen verwendet werden, um Variablen zu definieren:
Und so auf Bits testen:
quelle
Swift 2.0 Beispiel aus der Dokumentation:
Sie finden es hier
quelle
In Swift 2 (derzeit Beta als Teil der Xcode 7-Beta) werden
NS_OPTIONS
Typstile als Untertypen des neuenOptionSetType
Typs importiert . Dank der neuen Protokollerweiterungsfunktion und der Art und Weise,OptionSetType
wie sie in der Standardbibliothek implementiert ist, können Sie Ihre eigenen Typen deklarierenOptionsSetType
, die dieselben Funktionen und Methoden wie importierteNS_OPTIONS
Typen erweitern und erhalten.Diese Funktionen basieren jedoch nicht mehr auf bitweisen arithmetischen Operatoren. Das Arbeiten mit einer Reihe nicht exklusiver boolescher Optionen in C erfordert das Maskieren und Twiddeln von Bits in einem Feld. Dies ist ein Implementierungsdetail. Wirklich, eine Reihe von Optionen ist eine Reihe ... eine Sammlung einzigartiger Gegenstände. So werden
OptionsSetType
alle Methoden aus demSetAlgebraType
Protokoll abgerufen, z. B. Erstellung aus Array-Literal-Syntax, Abfragen wiecontains
, Maskieren mitintersection
usw. (Sie müssen sich nicht mehr daran erinnern, welches lustige Zeichen für welchen Mitgliedschaftstest verwendet werden soll!)quelle
quelle
Wenn Sie nicht mit Objective-C zusammenarbeiten müssen und nur die Oberflächensemantik von Bitmasken in Swift möchten , habe ich eine einfache "Bibliothek" namens BitwiseOptions geschrieben, die dies mit regulären Swift-Aufzählungen tun kann, z.
und so weiter. Hier werden keine tatsächlichen Bits umgedreht. Dies sind festgelegte Operationen für undurchsichtige Werte. Das Wesentliche finden Sie hier .
quelle
Wie Rickster bereits erwähnt hat, können Sie OptionSetType in Swift 2.0 verwenden. NS_OPTIONS-Typen werden als konform mit dem
OptionSetType
Protokoll importiert , das eine satzartige Schnittstelle für Optionen bietet:Es gibt Ihnen diese Arbeitsweise:
quelle
Wenn die einzige Funktionalität, die wir benötigen, eine Möglichkeit ist, Optionen mit zu kombinieren
|
und zu prüfen, ob kombinierte Optionen eine bestimmte Option mit&
einer Alternative zu Nate Cooks Antwort enthalten, könnte dies sein:Erstellen Sie eine Option
protocol
und Überladung|
und&
:Jetzt können wir Optionsstrukturen einfacher erstellen:
Sie können wie folgt verwendet werden:
quelle
Veröffentlichen Sie einfach ein zusätzliches Beispiel für alle anderen, die sich gefragt haben, ob Sie zusammengesetzte Optionen kombinieren können. Sie können und sie kombinieren sich wie erwartet, wenn Sie an gute alte Bitfelder gewöhnt sind:
Es glättet das Set
[.AB, .X]
in[.A, .B, .X]
(zumindest semantisch):quelle
Niemand sonst hat es erwähnt - und ich habe es nach einigem Basteln irgendwie falsch gemacht -, aber ein Swift-Set scheint ziemlich gut zu funktionieren.
Wenn wir (vielleicht nach einem Venn-Diagramm?) Überlegen, was eine Bitmaske tatsächlich darstellt, handelt es sich um eine möglicherweise leere Menge.
Wenn wir uns dem Problem anhand der ersten Prinzipien nähern, verlieren wir natürlich die Bequemlichkeit bitweiser Operatoren, erhalten jedoch leistungsstarke satzbasierte Methoden, die die Lesbarkeit verbessern.
Hier ist mein Basteln zum Beispiel:
Ich finde das schön, weil ich der Meinung bin, dass es sich um einen ersten Ansatz für das Problem handelt - ähnlich wie bei Swift - und nicht darum, Lösungen im C-Stil anzupassen.
Ich würde auch gerne einige Obj-C-Anwendungsfälle hören, die dieses andere Paradigma in Frage stellen würden, bei dem die ganzzahligen Rohwerte immer noch Verdienst zeigen.
quelle
Um eine harte Codierung der Bitpositionen zu vermeiden, die bei der Verwendung unvermeidbar ist
(1 << 0)
,(1 << 1)
,(1 << 15)
usw. oder noch schlimmer1
,2
,16384
usw. oder eine hexadezimalen Variation könnte man definiert zunächst die Bits in einenum
, dann sagte lassen Enumeration das Bit Ordnungs Berechnung tun:quelle
Ich verwende Folgendes: Ich benötige beide Werte, die ich erhalten kann: rawValue zum Indizieren von Arrays und value für Flags.
Und wenn Sie mehr benötigen, fügen Sie einfach eine berechnete Eigenschaft hinzu.
quelle
Betreff: Sandbox- und Lesezeichenerstellung mit Optionssätzen mit mehreren Optionen
Lösung für die Notwendigkeit, Optionen für Kreationen zu kombinieren, nützlich, wenn sich nicht alle Optionen gegenseitig ausschließen.
quelle
Nates Antwort ist gut, aber ich würde es so machen:
quelle
Verwenden Sie einen Optionstyp, der in Swift 3 verwendet wird
OptionSet
quelle