Você terá que criar acessores personalizados se quiser restringir os valores a um enum. Então, primeiro você declararia um enum, assim:
typedef enum {
kPaymentFrequencyOneOff = 0,
kPaymentFrequencyYearly = 1,
kPaymentFrequencyMonthly = 2,
kPaymentFrequencyWeekly = 3
} PaymentFrequency;
Em seguida, declare getters e setters para sua propriedade. É uma má ideia substituir os existentes, uma vez que os acessadores padrão esperam um objeto NSNumber em vez de um tipo escalar, e você terá problemas se alguma coisa nas ligações ou sistemas KVO tentar acessar seu valor.
- (PaymentFrequency)itemTypeRaw {
return (PaymentFrequency)[[self itemType] intValue];
}
- (void)setItemTypeRaw:(PaymentFrequency)type {
[self setItemType:[NSNumber numberWithInt:type]];
}
Finalmente, você deve implementar + keyPathsForValuesAffecting<Key>
para obter notificações KVO para itemTypeRaw quando o itemType muda.
+ (NSSet *)keyPathsForValuesAffectingItemTypeRaw {
return [NSSet setWithObject:@"itemType"];
}
enum
s?int16_t
e pronto.Você pode fazer assim, de maneira mais simples:
E em seu modelo, defina
itemType
um número de 16 bits. Tudo feito. Nenhum código adicional necessário. Basta colocar no seu habitualSe você estiver usando o Xcode para criar sua
NSManagedObject
subclasse, certifique-se de que a configuração " usar propriedades escalares para tipos de dados primitivos " esteja marcada.fonte
retain
está relacionado ao gerenciamento de memória, não se ele é armazenado no banco de dados ou não.Uma abordagem alternativa que estou considerando é não declarar um enum, mas, em vez disso, declarar os valores como métodos de categoria em NSNumber.
fonte
Se você estiver usando o mogenerator, dê uma olhada em: https://github.com/rentzsch/mogenerator/wiki/Using-enums-as-types . Você pode ter um atributo Integer 16 chamado
itemType
, com umattributeValueScalarType
valor deItem
nas informações do usuário. Em seguida, nas informações do usuário para sua entidade, definaadditionalHeaderFileName
o nome do cabeçalho no qual oItem
enum está definido. Ao gerar seus arquivos de cabeçalho, o mogenerator fará automaticamente com que a propriedade tenha oItem
tipo.fonte
Eu defino o tipo de atributo como inteiro de 16 bits e uso isto:
...
fonte
Como os enums são apoiados por um curto padrão, você também não pode usar o wrapper NSNumber e definir a propriedade diretamente como um valor escalar. Certifique-se de definir o tipo de dados no modelo de dados principal como "Integer 32".
MyEntity.h
Em outro lugar no código
Ou analisar de uma string JSON ou carregar de um arquivo
fonte
Tenho feito muito isso e acho o seguinte formulário útil:
Nesse caso, o enum é muito simples:
e chamo de pedante, mas eu uso enums para nomes de campo, assim:
Como isso pode ser trabalhoso para modelos de dados complexos, escrevi um gerador de código que consome o MOM / entidades para liberar todos os mapeamentos. Minhas entradas acabam sendo um dicionário do tipo Tabela / Linha para Enum. Enquanto fazia isso, também gerei o código de serialização JSON. Eu fiz isso para modelos muito complexos e acabou economizando muito tempo.
fonte
O código colado abaixo funciona para mim e eu o adicionei como um exemplo funcional completo. Eu gostaria de ouvir opiniões sobre essa abordagem, já que pretendo usá-la extensivamente em todos os meus aplicativos.
Deixei o @dynamic no lugar, pois ele é satisfeito pelo getter / setter nomeado na propriedade.
De acordo com a resposta do iKenndac, não substituí os nomes getter / setter padrão.
Incluí alguma verificação de intervalo por meio de um NSAssert nos valores válidos de typedef.
Também adicionei um método para obter um valor de string para o typedef fornecido.
Prefixo as constantes com "c" em vez de "k". Eu sei o raciocínio por trás de "k" (origens matemáticas, histórico), mas parece que estou lendo código ESL com ele, então uso "c". Só uma coisa pessoal.
Há uma questão semelhante aqui: typedef como um tipo de dados Core
Eu apreciaria qualquer contribuição sobre esta abordagem.
fonte
Solução para classes geradas automaticamente
do gerador de código do Xcode (ios 10 e superior)
Se você criar uma entidade chamada "YourClass", o Xcode escolherá automaticamente "Class Definition" como padrão um tipo de Codegen em "Data Model Inspector". isso irá gerar classes abaixo:
Versão Swift:
Versão Objective-C:
Escolheremos "Categoria / Extensão" na opção Codegen em vez de "Definição de Classe" no Xcode.
Agora, se quisermos adicionar um enum, vá e crie outra extensão para sua classe gerada automaticamente e adicione suas definições de enum aqui como abaixo:
Agora, você pode criar acessores personalizados se quiser restringir os valores a um enum. Verifique a resposta aceita pelo proprietário da pergunta . Ou você pode converter seus enums enquanto os define com o método de conversão explicitamente usando o operador cast como abaixo:
Verifique também
Geração automática de subclasse Xcode
fonte