Fundição tipo Objective-C
A conversão de tipo é uma maneira de converter uma variável de um tipo de dados para outro tipo de dados. Por exemplo, se você deseja armazenar um valor longo em um inteiro simples, você pode digitar cast long para int. Você pode converter valores de um tipo para outro explicitamente usando ocast operator como segue -
(type_name) expression
Em Objective-C, geralmente usamos CGFloat para fazer operação de ponto flutuante, que é derivado do tipo básico de float no caso de 32 bits e duplo no caso de 64 bits. Considere o exemplo a seguir, onde o operador de conversão faz com que a divisão de uma variável inteira por outra seja realizada como uma operação de ponto flutuante -
#import <Foundation/Foundation.h>
int main() {
int sum = 17, count = 5;
CGFloat mean;
mean = (CGFloat) sum / count;
NSLog(@"Value of mean : %f\n", mean );
return 0;
}
Quando o código acima é compilado e executado, ele produz o seguinte resultado -
2013-09-11 01:35:40.047 demo[20634] Value of mean : 3.400000
Deve-se notar aqui que o operador de elenco tem precedência sobre a divisão, portanto, o valor de sum é primeiro convertido para tipo double e, finalmente, é dividido por contagem, resultando em um valor duplo.
As conversões de tipo podem ser implícitas, o que é executado pelo compilador automaticamente ou podem ser especificadas explicitamente através do uso do cast operator. É considerada uma boa prática de programação usar o operador de conversão sempre que forem necessárias conversões de tipo.
Promoção Inteira
A promoção de inteiros é o processo pelo qual os valores do tipo inteiro "menor" que int ou unsigned int são convertidos em int ou unsigned int. Considere um exemplo de adição de um caractere em um int -
#import <Foundation/Foundation.h>
int main() {
int i = 17;
char c = 'c'; /* ascii value is 99 */
int sum;
sum = i + c;
NSLog(@"Value of sum : %d\n", sum );
return 0;
}
Quando o código acima é compilado e executado, ele produz o seguinte resultado -
2013-09-11 01:38:28.492 demo[980] Value of sum : 116
Aqui, o valor de soma está chegando a 116 porque o compilador está fazendo promoção de inteiros e convertendo o valor de 'c' para ascii antes de realizar a operação de adição real.
Conversão Aritmética Usual
o usual arithmetic conversionssão executados implicitamente para converter seus valores em um tipo comum. O compilador primeiro realiza a promoção de inteiro , se os operandos ainda tiverem tipos diferentes, eles serão convertidos para o tipo que aparece mais alto na seguinte hierarquia -
As conversões aritméticas usuais não são realizadas para os operadores de atribuição, nem para os operadores lógicos && e ||. Tomemos o seguinte exemplo para entender o conceito -
#import <Foundation/Foundation.h>
int main() {
int i = 17;
char c = 'c'; /* ascii value is 99 */
CGFloat sum;
sum = i + c;
NSLog(@"Value of sum : %f\n", sum );
return 0;
}
Quando o código acima é compilado e executado, ele produz o seguinte resultado -
2013-09-11 01:41:39.192 demo[15351] Value of sum : 116.000000
Aqui, é simples entender que o primeiro c é convertido em inteiro, mas como o valor final é float, a conversão aritmética usual se aplica e o compilador converte ie c em float e adiciona-os produzindo um resultado float.