Na documentação da Apple sobre interação com APIs C, eles descrevem como as NS_ENUM
enumerações no estilo C marcadas como são importadas como enumerações Swift. Isso faz sentido, e como as enumerações no Swift são prontamente fornecidas como o enum
tipo de valor, é fácil ver como criar as nossas.
Mais abaixo, diz o seguinte sobre as NS_OPTIONS
opções de estilo C marcadas:
Swift também importa opções marcadas com a
NS_OPTIONS
macro. Considerando que as opções se comportam de forma semelhante a enumerações importados, as opções também podem suportar algumas operações bit a bit, tais como&
,|
, e~
. No Objective-C, você representa uma opção vazia definida com a constante zero (0
). No Swift, usenil
para representar a ausência de quaisquer opções.
Dado que não há um options
tipo de valor no Swift, como podemos criar uma variável de opções C-Style para trabalhar?
fonte
RawOptionsSetType
: nshipster.com/rawoptionsettypeRespostas:
Swift 3.0
Quase idêntico ao Swift 2.0. OptionSetType foi renomeado para OptionSet e as enumerações são escritas em minúsculas por convenção.
Em vez de fornecer uma
none
opção, a recomendação do Swift 3 é simplesmente usar um literal de matriz vazio:Outro uso:
Swift 2.0
No Swift 2.0, as extensões de protocolo cuidam da maior parte do padrão, agora importadas como uma estrutura em conformidade
OptionSetType
. (RawOptionSetType
desapareceu a partir do Swift 2 beta 2.) A declaração é muito mais simples:Agora podemos usar semântica baseada em conjunto com
MyOptions
:Swift 1.2
Olhando para as opções de Objective-C que foram importados por Swift (
UIViewAutoresizing
, por exemplo), podemos ver que opções são declarados como umstruct
em conformidade com o protocoloRawOptionSetType
, que por conforma por sua vez a_RawOptionSetType
,Equatable
,RawRepresentable
,BitwiseOperationsType
, eNilLiteralConvertible
. Podemos criar nossos próprios assim:Agora podemos tratar esse novo conjunto de opções
MyOptions
, exatamente como descrito na documentação da Apple: você pode usar aenum
sintaxe-like:E também se comporta como esperamos que as opções se comportem:
Eu construí um gerador para criar um conjunto de opções Swift sem toda a localização / substituição.
Mais recentes: Modificações para o Swift 1.1 beta 3.
fonte
value
umUInt32
. Você também não precisa definir qualquer uma das funções, funções relevantes já estão definidos paraRawOptionSet
s (por exemplofunc |<T : RawOptionSet>(a: T, b: T) -> T
)UInt
? Está funcionando bem para mim.enum CollisionTypes: UInt32 { case Player = 1 case Wall = 2 case Star = 4 case Vortex = 8 case Finish = 16 }
O Xcode 6.1 Beta 2 trouxe algumas alterações ao
RawOptionSetType
protocolo (consulte esta entrada do blog Airspeedvelocity e as notas de versão da Apple ).Baseado no exemplo de Nate Cooks, aqui está uma solução atualizada. Você pode definir seu próprio conjunto de opções assim:
Em seguida, pode ser usado assim para definir variáveis:
E assim para testar os bits:
fonte
Exemplo do Swift 2.0 da documentação:
Você pode encontrá-lo aqui
fonte
No Swift 2 (atualmente beta como parte do Xcode 7 beta), os
NS_OPTIONS
tipos de estilo são importados como subtipos do novoOptionSetType
tipo. E, graças ao novo recurso Extensões de Protocolo e à maneira comoOptionSetType
é implementada na biblioteca padrão, você pode declarar seus próprios tipos que estendemOptionsSetType
e obtêm todas as mesmas funções e métodos que osNS_OPTIONS
tipos de estilo importados obtêm.Mas essas funções não são mais baseadas em operadores aritméticos bit a bit. Que trabalhar com um conjunto de opções booleanas não exclusivas em C requer mascarar e girar bits em um campo é um detalhe da implementação. Realmente, um conjunto de opções é um conjunto ... uma coleção de itens exclusivos. Então,
OptionsSetType
obtém todos os métodos doSetAlgebraType
protocolo, como criação da sintaxe literal da matriz, consultas comocontains
, mascaramento comintersection
etc. (Não é mais necessário lembrar qual personagem engraçado usar para qual teste de associação!)fonte
fonte
Se você não precisa interoperar com o Objective-C e apenas deseja a semântica de superfície das máscaras de bits no Swift, escrevi uma "biblioteca" simples chamada BitwiseOptions que pode fazer isso com enumerações regulares do Swift, por exemplo:
e assim por diante. Nenhum bit real está sendo invertido aqui. Essas são operações definidas em valores opacos. Você pode encontrar a essência aqui .
fonte
Como Rickster já mencionou, você pode usar OptionSetType no Swift 2.0. Os tipos NS_OPTIONS são importados conforme o
OptionSetType
protocolo, que apresenta uma interface de conjunto para opções:Dá a você esta maneira de trabalhar:
fonte
Se a única funcionalidade de que precisamos é uma maneira de combinar opções
|
e verificar se as opções combinadas contêm uma opção específica com&
uma alternativa à resposta de Nate Cook, pode ser:Crie opções
protocol
e sobrecarga|
e&
:Agora podemos criar estruturas de opções de maneira mais simples:
Eles podem ser usados da seguinte maneira:
fonte
Basta postar um exemplo extra para qualquer pessoa que estivesse se perguntando se você poderia combinar opções compostas. Você pode, e eles combinam como você esperaria se estivesse acostumado a bons e antigos campos de bits:
Nivela o conjunto
[.AB, .X]
em[.A, .B, .X]
(pelo menos semanticamente):fonte
Ninguém mais o mencionou - e eu meio que errei depois de alguns ajustes - mas um Swift Set parece funcionar bastante bem.
Se pensarmos (talvez em um diagrama de Venn?) Sobre o que uma máscara de bit está realmente representando, é um conjunto possivelmente vazio.
Obviamente, ao abordar o problema a partir dos primeiros princípios, perdemos a conveniência dos operadores bit a bit, mas obtemos poderosos métodos baseados em conjuntos que melhoram a legibilidade.
Aqui está o meu conserto, por exemplo:
Acho isso legal porque sinto que ele vem de uma abordagem de primeiros princípios para o problema - bem como Swift -, em vez de tentar adaptar soluções no estilo C.
Também gostaria de ouvir alguns casos de uso de Obj-C que desafiariam esse paradigma diferente, onde os valores brutos inteiros ainda mostram mérito.
fonte
A fim de evitar o disco de codificação as posições de bit, que é inevitável quando se utiliza
(1 << 0)
,(1 << 1)
,(1 << 15)
etc., ou ainda pior1
,2
,16384
etc., ou alguma variação hexadecimal, pode-se primeiro define os bits em umaenum
, em seguida, deixar o referido enum fazer o cálculo ordinal bits:fonte
Eu uso o seguinte e preciso dos dois valores que posso obter, rawValue para indexar matrizes e valor para sinalizadores.
E se precisar de mais, basta adicionar uma propriedade computada.
fonte
re: Sandbox e criações de favoritos usando conjuntos de opções com várias opções
solução para a necessidade de combinar opções de criações, útil quando nem todas as opções são mutuamente exclusivas.
fonte
A resposta de Nate é boa, mas eu faria DIY, assim:
fonte
Use um tipo de conjunto de opções, em um uso rápido 3
OptionSet
fonte