Estou tentando converter parte da minha classe Obj-C para Swift. E algumas outras classes de Obj-C ainda usam enum nessa classe convertida. Pesquisei nos Documentos de pré-lançamento e não consegui encontrá-lo ou talvez eu tenha perdido. Existe uma maneira de usar o Swift enum na classe Obj-C? Ou um link para o documento desta edição?
Foi assim que declarei minha enumeração no meu antigo código Obj-C e no novo código Swift.
meu antigo código Obj-C:
typedef NS_ENUM(NSInteger, SomeEnum)
{
SomeEnumA,
SomeEnumB,
SomeEnumC
};
@interface SomeClass : NSObject
...
@end
meu novo código Swift:
enum SomeEnum: NSInteger
{
case A
case B
case C
};
class SomeClass: NSObject
{
...
}
Atualização: Das respostas. Não pode ser feito na versão Swift anterior à 1.2. Mas de acordo com este Blog Swift oficial . No Swift 1.2 lançado junto com o XCode 6.3, você pode usar o Swift Enum no Objective-C adicionando @objc
na frente doenum
objective-c
enums
swift
myLifeasdog
fonte
fonte
Respostas:
A partir da versão 1.2 do Swift (Xcode 6.3), você pode. Prefixe simplesmente a declaração enum com
@objc
Vergonhosamente retirado do Blog Swift
No Objective-C, isso pareceria
fonte
BearBlack
,BearGrizzly
eBearPolar
!Para expandir a resposta selecionada ...
É possível compartilhar enumerações no estilo Swift entre Swift e Objective-C usando
NS_ENUM()
.Eles só precisam ser definidos em um contexto Objective-C usando
NS_ENUM()
e são disponibilizados usando a notação de ponto Swift.Do Usando Swift com cacau e Objective-C
Objetivo-C
Rápido
fonte
if let a = MyEnum(rawValue: 12345)
onde 12345 não faz parte dessa enumeração, o resultado não é uma enumeração opcional, mas sim inválida.No guia Usando Swift com cacau e Objective-C :
Portanto, não, você não pode usar uma enumeração Swift em uma classe Objective-C.
fonte
@objc
como @DanielGalasko apontado em sua resposta abaixo !!!@obj enum MyEnum: Int
ela funcionará bem nos arquivos Objective-C, como mencionado anteriormente. Se a sua enumeração é declarada com outro tipo valor bruto como@obj enum MyOtherEnum: String
, você não será capaz de usá-lo em arquivos Objective-CSwift 4.1, Xcode 9.4.1:
1) O swift enum deve ter o prefixo
@objc
e oInt
tipo:2) O nome do objetivo-C é o nome da enumeração + o nome do caso, por exemplo
CalendarPermissionAuthorized
:E, é claro, lembre-se de importar o cabeçalho da ponte Swift como o último item na lista de importação do arquivo Objective-C:
fonte
Se você preferir manter os códigos ObjC como estão, adicione um arquivo de cabeçalho auxiliar no seu projeto:
no arquivo de cabeçalho, adicione este tipo de enumeração:
Pode haver outro local no seu arquivo .m para fazer uma alteração: para incluir o arquivo de cabeçalho oculto:
substitua [YourProjectName] pelo nome do seu projeto. Esse arquivo de cabeçalho expõe todas as classes @objc definidas pelo Swift, enumerações ao ObjC.
Você pode receber uma mensagem de aviso sobre conversão implícita do tipo de enumeração ... Está tudo bem.
A propósito, você pode usar esse arquivo auxiliar de cabeçalho para manter alguns códigos ObjC, como #define constantes.
fonte
Se você (como eu) realmente deseja fazer uso de enumerações de String, pode criar uma interface especializada para o objetivo-c. Por exemplo:
Obviamente, isso não lhe dará a conveniência do preenchimento automático (a menos que você defina constantes adicionais no ambiente objetivo-c).
fonte
isso pode ajudar um pouco mais
Declaração do problema : - Eu tenho enum na classe swift, que estou acessando de outras classes swift, e agora preciso acessá-lo na minha classe C objetiva.
Antes de acessá-lo da classe objetivo-c: -
Alterações para acessá-lo da classe objetivo c
e adicione uma função para passar o valor
fonte
Depois de pesquisar isso, continuei encontrando apenas respostas parciais, então criei um exemplo inteiro de um aplicativo Swift vinculado ao objetivo C que possui enumerações do Swift usadas pelo código do objetivo C e enumerações do objetivo C do código Swift. É um projeto simples do Xcode que você pode executar e experimentar. Foi escrito usando o Xcode 10.3 com Swift 5.0
Projeto de Exemplo
fonte
enum SwAnimal
não tem os principais@obj
Caso você esteja tentando observar uma enumeração parecida com esta:
essa solução alternativa me ajudou.
Classe Observável:
@objc dynamic var observable: String?
crie sua instância enum assim:
Classe de observador:
private var _enumName: EnumName?
private let _instance = ObservableClass()
crio
Então é isso. Agora, toda vez que você alterar a
_enumName
classe observável, uma instância apropriada na classe observadora também será imediatamente atualizada.Obviamente, essa é uma implementação simplificada, mas deve fornecer uma idéia de como observar propriedades incompatíveis com o KVO.
fonte