Pergunta

Qual é a diferença entre NSNumber e NSInteger? Há mais primitivas como estes que eu deva saber? Existe uma para carros alegóricos?

Foi útil?

Solução

As respostas existentes são úteis; acrescentando-lhes:

Sim, NSUInteger dá duas vezes o alcance entre os números inteiros positivos como NSInteger, mas acho que uma outra razão fundamental para escolher entre os dois é simplesmente para distinguir entre os casos onde valores negativos simplesmente não fazem sentido .

Exemplo: o valor de retorno do método NSArray de count é um NSUInteger, o que faz sentido, uma vez que não podemos ter uma matriz com um número negativo de elementos. Quando o codificador sabe que é não assinado, ele / ela tem mais liberdade para executar operações que podem ser pouco confiáveis ??no caso assinados, incluindo operações bit a bit como o deslocamento. Este post conversações mais sobre assinado vs sem assinatura.

Meu palpite sobre CGFloat vs NSFloat (que não existe): Pode ser o caso de que os designers dos elementos de código NeXTStep-nomeados simplesmente não precisa especificar muitos valores float , fora de intervalos de tempo. Então, eles deram NSTimeInterval, que é um tipo de ponto flutuante, mas que é claramente destinada para uso com intervalos de tempo. E, francamente, é ótimo ter esse tipo porque você sabe que sempre deveria ter sido, em segundos, sem ter que lidar com um struct. Quando você se move no mundo dos gráficos (onde Core Graphics vive), de repente, carros alegóricos estão ao seu redor, pairando no ar (haha). Por isso, faz sentido introduzir um CGFloat lá. Este parágrafo é tudo "especulação educada."

Além disso, apenas para ser claro sobre por que você pode usar NSInteger etc, em vez de tipos primitivos : Porque desta forma é mais fácil escrever código portátil que tira proveito da arquitetura da máquina. Por exemplo, um CGFloat utiliza 32 bits em algumas máquinas e 64 bits sobre os outros, dependendo em grande parte da quantidade de um intervalo de eficiência há nessas máquinas para esses tamanhos. Em alguns casos, não há aceleração real para usar 32 bits vs 64 bits, então você pode muito bem usar 64 bits. Se você já declarou coisas como CGFloat de, de repente você obter essa precisão extra "de graça" quando você recompilar.

E, como iKenndac tem fora pontas, NSNumber é uma classe wrapper para todos destes (e outros tipos primitivos ou quase primitiva como o BOOL) que permite que você incluí-lo em seus NSArrays e NSDictionarys, arquivá-los mais facilmente, e fazer outras coisas que NSObjects pode fazer.

Outras dicas

NSNumber é uma classe, não um primitivo, e é usado quando você precisa colocar os números brutos em dicionários, matrizes, ou de outra forma encapsular-los. NSInteger, NSUInteger, CGFloat, etc, são tipos simples e correspondem (em sistemas de 32-bt como o iPhone) para int, unsigned int e float.

Como regra geral, se você precisa armazenar a algum lugar número, utilize NSNumber. Se você estiver fazendo cálculos, loops, etc, uso NSInteger, NSUInteger ou CGFloat.

Você pode embrulhar um NSInteger em um NSNumber:

NSNumber *aNumber = [NSNumber numberWithInteger:21];

... e recuperá-lo:

NSInteger anInteger = [aNumber integerValue];

Você pode encontrar mais informações aqui: http://iosdevelopertips.com/cocoa /nsnumber-and-nsinteger.html

NSInteger é como um int tradicional em C. É um typedef. Há outros como NSUInteger, CGFloat, etc. que todos são sinônimos de tipos primitivos.

NSNumber é útil quando você precisa ficar um número em um NSArray ou NSDictionary. A prática padrão é usar essas coleções contra seu próprio material circulante; a desvantagem é que apenas pode conter Objectivo-C objetos.

NSNumber essencialmente envolve uma int (ou flutuador, etc.) para um objecto Obj-C (semelhante ao conceito de C # / Java de 'boxe' um tipo primitivo) que pode ser adicionado a uma matriz:

NSArray * myArray = [[NSArray alloc] init];
[myArray addObject:3]; // invalid, will not compile.
[myArray [NSNumber numberWithInt:3]]; // ok

Por motivos de desempenho, se você puder, use tipos primitivos (como int, float, int []). No entanto, às vezes você não pode evitar NSArray / NSNumber, como quando você está lendo ou escrevendo entradas em um arquivo .plist.

NSNumber é geralmente usada para armazenar variáveis, NSUInteger é usado para aritmética

Você pode mudar uma NSNumber a um NSUInteger fazendo isso:

NSNumber *variable = @1;
NSUInteger variableInt = [variable unsignedIntegerValue];

Tem sido dito antes, mas como regra geral, as variáveis ??que precisam ser definidos com * são classes Objective C, enquanto que as variáveis ??que não precisa de um * são primitivos C.

Como foi dito por outros antes, NSNumber é uma subclasse NSObject. Não é um C primitiva ( como int, sem assinatura int, float, double, etc. ) NSInteger, CGFloat, NSUInteger são typedefs simples sobre os primitivos C.

A necessidade de NSNumber surge da necessidade de usar os números como parâmetros para APIs que requerem objetos. Exemplo é, quando você deseja armazenar um número em uma NSArray, In-Core Data, ou em um NSDictionary.

Há mais primitivas como estes que eu deva saber? Bem, NSNumber não é um tipo primitivo, e isso envolve todos os tipos de números (carros alegóricos, tipos integrais, booleans e assim por diante). Você também deve aprender sobre NSValue, que é a base para NSNumber.

Existe uma para carros alegóricos? Não há typedef "NS" para float, mas NSNumber pode envolver em torno de qualquer número float:

NSNumber *myPi = [NSNumber numberWithFloat:3.1415926];

Ou você poderia usar os CoreGraphics tipo primitivo CGFloat.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top