Dans la documentation d'Apple sur l'interaction avec les API C, ils décrivent la manière NS_ENUM
dont les énumérations de style C marquées sont importées en tant qu'énumérations Swift. Cela a du sens, et comme les énumérations dans Swift sont facilement fournies comme enum
type de valeur, il est facile de voir comment créer la nôtre.
Plus bas, il est dit ceci à propos des NS_OPTIONS
options de style C marquées:
Swift importe également les options marquées de la
NS_OPTIONS
macro. Alors que les options se comportent comme énumérations importées, les options peuvent également prendre en charge certaines opérations binaires, telles que&
,|
et~
. En Objective-C, vous représentez un jeu d'options vide avec la constante zéro (0
). Dans Swift, utiliseznil
pour représenter l'absence d'options.
Étant donné qu'il n'y a pas de options
type valeur dans Swift, comment pouvons-nous créer une variable d'options de style C avec laquelle travailler?
la source
RawOptionsSetType
: nshipster.com/rawoptionsettypeRéponses:
Swift 3.0
Presque identique à Swift 2.0. OptionSetType a été renommé OptionSet et les énumérations sont écrites en minuscules par convention.
Au lieu de fournir une
none
option, la recommandation de Swift 3 est d'utiliser simplement un littéral de tableau vide:Autre usage:
Swift 2.0
Dans Swift 2.0, les extensions de protocole prennent en charge la plupart des passe-partout pour ceux-ci, qui sont maintenant importés en tant que structure conforme à
OptionSetType
. (RawOptionSetType
a disparu depuis Swift 2 beta 2.) La déclaration est beaucoup plus simple:Nous pouvons maintenant utiliser la sémantique basée sur les ensembles avec
MyOptions
:Swift 1.2
En regardant les options Objective-C qui ont été importés par Swift (
UIViewAutoresizing
par exemple), on peut voir que les options sont déclarées commestruct
conforme au protocoleRawOptionSetType
, qui est conforme à son tour_RawOptionSetType
,Equatable
,RawRepresentable
,BitwiseOperationsType
, etNilLiteralConvertible
. Nous pouvons créer le nôtre comme ceci:Nous pouvons maintenant traiter ce nouvel ensemble d'options,
MyOptions
comme décrit dans la documentation d'Apple: vous pouvez utiliser laenum
syntaxe -like:Et il se comporte également comme nous nous attendrions à ce que les options se comportent:
J'ai construit un générateur pour créer un ensemble d'options Swift sans toutes les recherches / remplacements.
Dernières: Modifications pour Swift 1.1 beta 3.
la source
value
unUInt32
. Vous n'avez pas non plus besoin de définir aucune des fonctions, les fonctions pertinentes sont déjà définies pourRawOptionSet
s (par exemplefunc |<T : RawOptionSet>(a: T, b: T) -> T
)UInt
? Cela fonctionne bien pour moi.enum CollisionTypes: UInt32 { case Player = 1 case Wall = 2 case Star = 4 case Vortex = 8 case Finish = 16 }
Xcode 6.1 Beta 2 a apporté quelques modifications au
RawOptionSetType
protocole (voir cette entrée de blog Airspeedvelocity et les notes de publication d'Apple ).Basé sur l'exemple de Nate Cooks, voici une solution mise à jour. Vous pouvez définir votre propre jeu d'options comme ceci:
Il peut ensuite être utilisé comme ceci pour définir des variables:
Et comme ceci pour tester les bits:
la source
Exemple Swift 2.0 de la documentation:
Vous pouvez le trouver ici
la source
Dans Swift 2 (actuellement bêta dans le cadre de la version bêta de Xcode 7), les
NS_OPTIONS
types -style sont importés en tant que sous-types du nouveauOptionSetType
type. Et grâce à la nouvelle fonctionnalité d' extensions de protocole et à la manière dontOptionSetType
est implémentée dans la bibliothèque standard, vous pouvez déclarer vos propres types qui s'étendentOptionsSetType
et obtiennent toutes les mêmes fonctions et méthodes que lesNS_OPTIONS
types -style importés .Mais ces fonctions ne sont plus basées sur des opérateurs arithmétiques bit à bit. Le fait de travailler avec un ensemble d'options booléennes non exclusives en C nécessite de masquer et de modifier les bits dans un champ est un détail d'implémentation. Vraiment, un ensemble d'options est un ensemble ... une collection d'objets uniques. Ainsi
OptionsSetType
obtient toutes les méthodes duSetAlgebraType
protocole, comme la création à partir de la syntaxe littérale de tableau, les requêtes commecontains
, le masquage avecintersection
, etc. (Plus besoin de se rappeler quel caractère amusant utiliser pour quel test d'appartenance!)la source
la source
Si vous n'avez pas besoin d'interagir avec Objective-C et que vous voulez simplement la sémantique de surface des masques de bits dans Swift, j'ai écrit une simple "bibliothèque" appelée BitwiseOptions qui peut le faire avec des énumérations Swift régulières, par exemple:
etc. Aucun bit réel n'est retourné ici. Ce sont des opérations définies sur des valeurs opaques. Vous pouvez trouver l'essentiel ici .
la source
Comme Rickster l'a déjà mentionné, vous pouvez utiliser OptionSetType dans Swift 2.0. Les types NS_OPTIONS sont importés comme étant conformes au
OptionSetType
protocole, qui présente une interface de type set pour les options:Cela vous donne cette façon de travailler:
la source
Si la seule fonctionnalité dont nous avons besoin est un moyen de combiner des options
|
et de vérifier si les options combinées contiennent une option particulière avec&
une alternative à la réponse de Nate Cook pourrait être la suivante:Créez une option
protocol
et une surcharge|
et&
:Maintenant, nous pouvons créer des structures d'options plus simplement comme ceci:
Ils peuvent être utilisés comme suit:
la source
Il suffit de publier un exemple supplémentaire pour quiconque se demande si vous pouvez combiner des options composées. Vous pouvez, et ils se combinent comme vous vous en doutez si vous êtes habitué aux bons vieux champs de bits:
Il aplatit l'ensemble
[.AB, .X]
en[.A, .B, .X]
(au moins sémantiquement):la source
Personne d'autre ne l'a mentionné - et je me suis en quelque sorte trompé après quelques bricolages - mais un Swift Set semble fonctionner assez bien.
Si nous pensons (peut-être à un diagramme de Venn?) À ce qu'un masque de bits représente réellement, c'est un ensemble éventuellement vide.
Bien sûr, en abordant le problème à partir des premiers principes, nous perdons la commodité des opérateurs bit à bit, mais gagnons de puissantes méthodes basées sur des ensembles qui améliorent la lisibilité.
Voici mon bricolage par exemple:
Je trouve cela agréable parce que je pense que cela vient d'une approche basée sur les premiers principes du problème - un peu comme Swift - plutôt que d'essayer d'adapter des solutions de type C.
Je voudrais également entendre quelques cas d'utilisation d'Obj-C qui remettraient en question ce paradigme différent, où les valeurs brutes entières montrent encore du mérite.
la source
Afin d'éviter de coder en dur les positions de bits, ce qui est inévitable lors de l' utilisation
(1 << 0)
,(1 << 1)
,(1 << 15)
etc. , ou pire encore1
,2
,16384
etc. , ou une variante hexadécimal, on pourrait d' abord définit les bits dans unenum
, puis laissez dit ENUM faire le calcul ordinale bits:la source
J'utilise ce qui suit, j'ai besoin des deux valeurs que je peux obtenir, rawValue pour l'indexation des tableaux et la valeur pour les indicateurs.
Et si vous en avez besoin de plus, ajoutez simplement une propriété calculée.
la source
re: Création de bacs à sable et de signets à l'aide de jeux d'options avec plusieurs options
solution au besoin de combiner des options pour les créations, utile lorsque toutes les options ne s'excluent pas mutuellement.
la source
La réponse de Nate est bonne mais je ferais du bricolage, comme ceci:
la source
Utiliser un type de jeu d'options, en utilisation Swift 3
OptionSet
la source