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 nint
e nfloat
nuint
, como 32 bits, sempre caberão em 32 ou 64 bits.
nint
, nuint
e nfloat
são todos implicitamente conversíveis para long
e double
ulong
, como valores de 32 ou 64 bits, sempre caberão no armazenamento de 64 bits.
Você deve usar conversões explícitas de nint
e nfloat
nuint
em int
, uint
e float
como os tipos nativos podem conter 64 bits de armazenamento.
Você deve usar conversões explícitas de long
e double
ulong
em nint
e 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
.