Objective-C布尔值字面量和宏

4
免责声明:本人对Objective-C知识有限(只是出于好奇)。
if (@YES)

vs

if (YES)

有什么不同之处?

据我所知,@YES是一个布尔对象文字,而YES是扩展为1的宏。这样说是否正确?如果是的话,为什么要使用@YES而不是YES,反之亦然?

3个回答

6

@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,它们的行为与你预期的不同。

1
@ Aristides:不,但是@YES@NOYES1都是非零值,在if表达式中这是有意义的。 - Martin R
@Aristides if (@NO)if (NO) 是不同的。前者是测试 [NSNumber numberWithBool:NO] 是否返回一个有效的对象(它确实返回)。而后者实际上是在测试该值是否为假。 - Dave DeLong
这就是我的意思。如果(@literal)则只需测试它是否返回一个对象(无论如何,它都会返回一个对象,对吧),而如果(NO)变成了if(0),因此实际预期的测试是什么? - Aristides

1
@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中。

1
< p > @ 符号是 Objective-C 的一个最近添加的功能,它将字面量转换为对象表示形式,以 NSNumber 实例的形式呈现。

如果您需要将字面量存储在只能存储对象(类型为 id)的数组和字典中,则这特别有用。

使用方式非常简单,不需要为文字创建对象,因此应直接使用文字。

@ 符号一直用于表示 NSString 对象,仅在 2-3 年前扩展了该语法以包括字面量和表达式。


我知道你的意思不同,但是“@符号是Objective-C的最新添加”有点有趣。@和Objective-C一样古老。 - Gabriele Petronella
@GabrielePetronella,我知道你的意思不同,但是“* @ *像Objective-C一样古老”,这有点有趣。@已经存在500多年了。 - DrummerB
@GabrielePetronella :) - Joost

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接