Os “Números Complexos” já estão definidos no Objective-C?

Para o código a seguir,

-Como o Objective-C sabe adicionar um "i" aos números complexos? Quando defini "real" e "imaginário" como valores duplos no arquivo Complex.m, imaginei que o Xcode SABERIA SOMENTE que "real" e "imaginário" são valores duplos.

-Se eu adicionar um "i" ao final de um número complexo no arquivo main.m, por exemplo, se eu virar "myComplex.imaginary = 7;" em "myComplex.imaginary = 7i;" a saída para essa linha se torna 0.00000i, se eu adicionar qualquer outra letra, o programa simplesmente não será executado, por que isso acontece?

Basicamente, parece-me que o significado de "real" e "imaginário" já são conhecidos pelo Xcode, o livro que estou seguindo não especificou isso, então estou um pouco confuso.

Além disso, devo observar que não criei o código a seguir, pois não consegui descobrir o problema sozinho, esse código foi copiado de um membro do meu fórum de livros.

//  Complex.h

#include <Foundation/Foundation.h>

@interface Complex : NSObject
@property double real, imaginary;
-(void) print;
-(Complex *) add: (Complex *) complexNum;
-(Complex *) subtract: (Complex *) complexNum;
-(Complex *) multiply: (Complex *) complexNum;
-(Complex *) divide: (Complex *) complexNum;
@end

//  Complex.m

#import "Complex.h"

@implementation Complex
@synthesize real, imaginary;

-(void) print
{
    NSLog(@"%f + %fi", real, imaginary);
}
-(Complex *) add: (Complex *) complexNum
{
    Complex *result = [[Complex alloc]init];
    result.real = real + complexNum.real;
    result.imaginary = imaginary + complexNum.imaginary;
    return result;
}
-(Complex *) subtract: (Complex *) complexNum
{
    Complex *result = [[Complex alloc]init];
    result.real = real - complexNum.real;
    result.imaginary = imaginary - complexNum.imaginary;
    return result;
}
-(Complex *) multiply: (Complex *) complexNum
{
    Complex *result = [[Complex alloc]init];
    result.real = real * complexNum.real;
    result.imaginary = imaginary * complexNum.imaginary;
    return result;
}
-(Complex *) divide: (Complex *) complexNum
{
    Complex *result = [[Complex alloc]init];
    result.real = real / complexNum.real;
    result.imaginary = imaginary / complexNum.imaginary;
    return result;
}
@end

//
//  main.m
//  Complex

#include <Foundation/Foundation.h>
#import "Complex.h"

int main(int argc, const char *argv[]) {

    @autoreleasepool {
        Complex *myComplex = [[Complex alloc]init];
        Complex *totalComplex = [[Complex alloc]init];
        Complex *yourComplex = [[Complex alloc]init];

        myComplex.real = 5.3;
        myComplex.imaginary = 7;
        [myComplex print];
        NSLog(@"+");

        yourComplex.real = 2.7;
        yourComplex.imaginary = 4;
        [yourComplex print];
        NSLog(@"=");

        totalComplex = [myComplex add: yourComplex];
        [totalComplex print];
    }
    return 0;
}

questionAnswers(4)

yourAnswerToTheQuestion