2012-07-28 7 views
5

Utilizando la sintaxis Convertir al moderno objeto C de XCode 4.4, mis llamadas [NSNumber numberWithBool:YES] se convirtieron a @(YES). Tuve un problema que olvidé y lo cambié yo mismo al @YES, que se supone que es la sintaxis correcta.¿Por qué @YES da un error de "expresión esperada", pero @ (YES) compila?

Sin embargo, yo haciendo así que da el error:

Unexpected type name 'BOOL': expected expression

Sé que hay una sintaxis "expresión", pero no veo por qué no puedo simplemente usar @YES y @NO.

// Compiler error: 
NSDictionary *userDefaultsDefaults = @{@"hasBeenLaunched": @YES}; 

// No error 
NSDictionary *userDefaultsDefaults = @{@"hasBeenLaunched": @(YES)}; 

Por qué se compila @(YES) mientras @YES no lo hace, y lo que puede hacer para remediar esto?

+0

¿Qué estás preguntando exactamente? –

Respuesta

10

Respuesta corta:

Uso @(YES) y @(NO)


más larga respuesta:

Tenga una mirada en this answer que explica que esto es sobre todo parece ser un descuido por parte de Apple.

Un comentarista de this answer también señala:

There is one small thing I'd like to warn about. Literal bools are also not supported because of this. However, a quick fix that I implemented was adding this to the beginning of one of my common headers (in an iOS project)

#ifndef __IPHONE_6_0 
#if __has_feature(objc_bool) 
#undef YES 
#undef NO 
#define YES __objc_yes 
#define NO __objc_no 
#endif 
#endif 
+0

Ya veo. Entonces no estoy loco Gracias por el aviso. Lo agregué a mi prefijo y pude usar la sintaxis sin paréntesis, según lo deseado. – akaru

+1

Parece que esto está solucionado en Xcode 4.5, utilizando básicamente el mismo código, a juzgar por los [documentos LLVM] (http://clang.llvm.org/docs/ObjectiveCLiterals.html). –

0

Los nuevos literales numéricos (como @YES) en la actualización Clang no se aplican plenamente en XCode hasta 4,5.

Cuestiones relacionadas