免责声明:本人对Objective-C知识有限(只是出于好奇)。
if (@YES)
vs
if (YES)
有什么不同之处?
据我所知,@YES是一个布尔对象文字,而YES是扩展为1的宏。这样说是否正确?如果是的话,为什么要使用@YES而不是YES,反之亦然?
if (@YES)
vs
if (YES)
有什么不同之处?
据我所知,@YES是一个布尔对象文字,而YES是扩展为1的宏。这样说是否正确?如果是的话,为什么要使用@YES而不是YES,反之亦然?
@YES
是 [NSNumber numberWithBool:YES]
的快捷方式,因此可以这样写:
if (@YES)
实际上是指
if ([NSNumber numberWithBool:YES] != nil)
请注意,无论数字(或布尔值)是什么都没有关系。您只需要测试它是否为有效对象。甚至@NO
将评估为YES
,如果您像这样测试它,因为它是一个非空的NSNumber
实例:
if (@NO) NSLog(@"test");
输出:
2013-12-07 21:02:49.828 MyApp[37512:70b] test
@YES
或者@NO
,它们的行为与你预期的不同。@YES, @1, @1.5
...这些都是字面量语法,相当于 [NSNumber numberWithBool:YES]
, [NSNumber numberWithInt:1]
, [NSNumber numberWithDouble:1.5]
。使用这种方法意味着你正在创建一个 NSNumber 对象。
YES
只是BOOL
类型,在Obj-C中它是一个原始类型,而不像NSNumber
一样是一个对象。 BOOL
类型在Objective-C中用于保存真或假值。这通常是您应该使用的方式。 只有在需要将这些原始类型存储在仅接受对象的地方时才会使用@YES
,例如如果您想将它们存储在NSArray
中。@
符号是 Objective-C 的一个最近添加的功能,它将字面量转换为对象表示形式,以 NSNumber
实例的形式呈现。
如果您需要将字面量存储在只能存储对象(类型为 id
)的数组和字典中,则这特别有用。
使用方式非常简单,不需要为文字创建对象,因此应直接使用文字。
@
符号一直用于表示 NSString
对象,仅在 2-3 年前扩展了该语法以包括字面量和表达式。
@
和Objective-C一样古老。 - Gabriele Petronella@
已经存在500多年了。 - DrummerB
@YES
,@NO
,YES
和1
都是非零值,在if表达式中这是有意义的。 - Martin Rif (@NO)
与if (NO)
是不同的。前者是测试[NSNumber numberWithBool:NO]
是否返回一个有效的对象(它确实返回)。而后者实际上是在测试该值是否为假。 - Dave DeLong