Compartilhar via


Tipos nativos para iOS e macOS

As APIs do Mac e do iOS usam tipos de dados específicos da arquitetura que são sempre de 32 bits em plataformas de 32 bits e 64 bits em plataformas de 64 bits.

Por exemplo, Objective-C mapeia o NSInteger tipo de dados para int32_t em sistemas de 32 bits e para int64_t em sistemas de 64 bits.

Para corresponder a esse comportamento, em nossa API unificada, estamos substituindo os usos anteriores de int (que no .NET é definido como sempre sendo System.Int32) para um novo tipo de dados: System.nint. Você pode pensar no "n" como "nativo", de modo que o tipo inteiro nativo da plataforma.

Com esses novos tipos de dados, o mesmo código-fonte é compilado para arquiteturas de 32 bits e 64 bits, dependendo dos sinalizadores de compilação.

Novos tipos de dados

A tabela a seguir mostra as alterações em nossos tipos de dados para corresponder a esse novo mundo de 32/64 bits:

Tipo nativo Tipo de backup de 32 bits Tipo de backup de 64 bits
System.nint System.Int32 (int) System.Int64 (long)
System.nuint System.UInt32 (uint) System.UInt64 (ulong)
System.nfloat System.Single (float) System.Double (double)

Escolhemos esses nomes para permitir que seu código C# pareça mais ou menos da mesma maneira que seria hoje.

Conversões implícitas e explícitas

O design dos novos tipos de dados destina-se a permitir que um único arquivo de origem C# use naturalmente o armazenamento de 32 ou 64 bits, dependendo da plataforma host e das configurações de compilação.

Isso exigiu que criemos um conjunto de conversões implícitas e explícitas de e para os tipos de dados específicos da plataforma para os tipos de dados integrais e de ponto flutuante do .NET.

Os operadores de conversões implícitas são fornecidos quando não há possibilidade de perda de dados (valores de 32 bits sendo armazenados em um espaço de 64 bits).

Os operadores de conversões explícitas são fornecidos quando há um potencial de perda de dados (o valor de 64 bits está sendo armazenado em um local de armazenamento de 32 ou potencialmente 32).

int, uint e float são todos implicitamente conversíveis para ninte nfloatnuint, como 32 bits, sempre caberão em 32 ou 64 bits.

nint, nuint e nfloat são todos implicitamente conversíveis para longe doubleulong, como valores de 32 ou 64 bits, sempre caberão no armazenamento de 64 bits.

Você deve usar conversões explícitas de ninte nfloatnuint em int, uint e float como os tipos nativos podem conter 64 bits de armazenamento.

Você deve usar conversões explícitas de longe doubleulong em ninte nuint , e nfloat como os tipos nativos só podem conter 32 bits de armazenamento.

Tipos coregraphics

Os tipos de dados point, size e retângulo usados com CoreGraphics usam 32 ou 64 bits, dependendo do dispositivo em que estão sendo executados. Quando vinculamos originalmente as APIs do iOS e do Mac, usamos estruturas de dados existentes que correspondiam aos tamanhos da plataforma host (os tipos de dados em System.Drawing).

Ao migrar para Unificado, você precisará substituir instâncias de System.Drawing por seus CoreGraphics equivalentes, conforme mostrado na tabela a seguir:

Tipo antigo em System.Drawing Novo tipo de dados CoreGraphics Descrição
RectangleF CGRect Contém informações de retângulo de ponto flutuante.
SizeF CGSize Contém informações de tamanho de ponto flutuante (largura, altura)
PointF CGPoint Contém um ponto flutuante, informações de ponto (X, Y)

Os tipos de dados antigos usados flutuam para armazenar os elementos das estruturas de dados, enquanto o novo usa System.nfloat.