Swift y Objective-C

Sintaxis de la arroba (@) en Objective-C: ¿por qué todo empieza con @? (Guía completa)

Cuando abres código Objective-C por primera vez, hay algo que llama tu atención de inmediato.

5 min de lectura
Imagen de portada de Sintaxis de la arroba (@) en Objective-C: ¿por qué todo empieza con @? (Guía completa)

Cuando abres código Objective-C por primera vez, hay algo que llama tu atención de inmediato.

Es la arroba (@), que aparece por todas partes.

Se escriben @interface, @property e incluso las cadenas como @“Hello”. Al principio puedes pensar: «¿Esto no es un error tipográfico?»

Sin embargo, esta @ tiene una razón muy clara.

En Objective-C, @ indica al compilador: «A partir de aquí no es C puro, sino sintaxis de extensión de Objective-C».

Hoy veremos de forma sencilla por qué esta arroba aparece igual en @interface, @property y @“cadenas”.


¿Qué es exactamente la @ de Objective-C?

Empecemos por lo esencial.

@ es un símbolo especial que indica al compilador: «Esta es sintaxis propia de Objective-C».

Para entenderlo, hay que conocer el origen de Objective-C.

Objective-C no es un lenguaje completamente nuevo. Es un lenguaje que añade funciones orientadas a objetos sobre C.

Es decir, incluye C al 100 % y le incorpora funciones como clases y mensajes.

Pero aquí surge un problema.

Desde el punto de vista del compilador, hay que distinguir qué pertenece a la sintaxis original de C y qué corresponde a la nueva sintaxis de Objective-C.

El marcador que traza esa frontera es precisamente @.


¿Por qué se eligió la arroba (@)?

También existen el asterisco (*) y la almohadilla (#), así que ¿por qué usar precisamente @?

La respuesta es sorprendentemente práctica.

En la sintaxis estándar de C, el símbolo @ no se utiliza en ninguna parte.

Recordemos los caracteres que se usan en C.

  • Nombres de variables y funciones: letras, números y guion bajo (_)
  • Operadores: +, -, *, /, =, &, etc.
  • Preprocesador: # (por ejemplo, #include)

@ no aparece en ninguna parte de esta lista.

Por eso los creadores de Objective-C adoptaron @. Era un símbolo seguro que nunca entraría en conflicto con el código C existente.

Si hubieran usado la palabra interface como palabra clave en lugar de @, todo el código C existente que utilizara una variable llamada interface se habría roto.

Anteponer @ evita ese tipo de conflicto desde el principio.

En pocas palabras, @ es como el tirador de un cajón separado donde se guarda la sintaxis exclusiva de Objective-C.

@ marca la frontera entre lo que proviene de C y lo que añade Objective-C
@ marca la frontera entre lo que proviene de C y lo que añade Objective-C

Por qué @interface, @property y @“cadenas” empiezan todas con @

Ahora llegamos al punto principal. Veamos por qué estas tres construcciones, que parecen distintas, empiezan exactamente con @.

La conclusión es que las tres son funciones exclusivas de Objective-C que no existen en C.

Veámoslas una por una.

@interface — Una directiva que abre el esqueleto, o declaración, de una clase. Como C no tiene el concepto de clase, había que marcarlo con @. @implementation y @end, sus parejas, existen por el mismo motivo.

@property — Una función que crea automáticamente la propiedad de un objeto. Como esta sintaxis tampoco existe en C puro, lleva @.

@“cadenas” — Este es el caso más interesante. «Hello» entre comillas y @“Hello” son objetos completamente distintos.

Comparémoslos en una tabla.

Categoría “Hello” @“Hello”
Qué es Matriz de caracteres al estilo C Objeto NSString
Pertenencia Sintaxis original de C Extensión de Objective-C
Función Una simple secuencia de caracteres Permite usar métodos como length

Al añadir una sola @ antes de las comillas, un simple bloque de texto se convierte en un «objeto».

Por eso hace falta @. Es como decir: «Crea esta cadena como un objeto NSString, no como una cadena C normal».

En resumen:

Ya sea @interface, @property o @“cadenas”, todas usan la misma marca @ porque son funciones que no existen en C y son exclusivas de Objective-C.


Una vista rápida con código

Explicarlo solo con palabras puede resultar algo abstracto, así que he preparado un ejemplo breve.

A continuación se muestra una declaración de clase sencilla. Observa cómo @ envuelve la sintaxis de Objective-C.

@interface Person : NSObject   // Inicio de la declaración de clase (CSintaxis inexistente en C)
@property NSString *name;      // Generación automática de propiedades
@end                           // Fin de la declaración

NSString *greeting = @"Hola"; // Antes de las comillas @ → NSString Objeto

Como puedes ver, todas las líneas que empiezan con @ son funciones añadidas por Objective-C.

En cambio, las partes sin @ son sintaxis heredada directamente de C.

Así, con solo comprobar si hay @, puedes distinguir enseguida: «Ah, esto es una extensión de Objective-C».

Con solo fijarte en @, leer código resulta mucho más sencillo
Con solo fijarte en @, leer código resulta mucho más sencillo

Preguntas frecuentes (Q&A)

P. ¿@ es lo mismo que el # del preprocesador?

No. El # de #include es una directiva del preprocesador que se procesa antes de compilar. En cambio, @ es una directiva del compilador de Objective-C que el compilador interpreta directamente, por lo que cumplen funciones distintas.

P. ¿Hay muchos más tipos de @ además de estos?

Sí, bastantes: @protocol, @selector, @try/@catch y @autoreleasepool, entre otros. Con la sintaxis moderna también puedes crear fácilmente arrays con @[], diccionarios con @{} e incluso objetos numéricos como @42.

P. Swift también tiene @, ¿verdad?

Exacto. Sin embargo, su significado es algo distinto. En Swift, @ se usa principalmente para marcar atributos, como @State y @IBOutlet. El origen es similar, pero sus usos deben distinguirse.


Las arrobas que aparecen en cada parte del código pueden resultar extrañas, pero cuando entiendes que son la «frontera entre C y Objective-C», empiezan a resultar familiares.

Seguir las @ permite ver claramente dónde comienza la sintaxis orientada a objetos. Si recuerdas esta perspectiva al leer código Objective-C, todo será mucho más fácil. ¡Que disfrutes programando!