2013-12-07 4 views
3

Отказ от ответственности: ограниченное знание Objective-C (передача любопытства).Objective-C Bool Литералы и макросы

if (@YES) 

против

if (YES) 

В чем разница?

Из того, что я понимаю, @YES является литералом объекта bool, а YES - макросом, который расширяется до 1? Это верно? Если да, зачем использовать @YES вместо YES или наоборот?

ответ

6

@YES ярлык для [NSNumber numberWithBool:YES], так это:

if (@YES) 

фактически означает

if ([NSNumber numberWithBool:YES] != nil) 

Обратите внимание, что это не имеет значения, какое количество (или булево значение), что есть. Вы просто проверяете, что это действительный объект. Даже @NO будет evaulate к YES если вы проверить это так, потому что это не-NIL NSNumber экземпляр:

if (@NO) NSLog(@"test"); 

Выход:

2013-12-07 21:02:49.828 MyApp[37512:70b] test 

Короче говоря: Не используйте @YES или @NO как что они не будут вести себя так, как вы ожидали бы.

+1

@ Аристиды: Нет, но '@ YES',' @ NO', 'YES' и' 1' - все * отличные от нуля *, и это то, что считается в если выражение. –

+0

@Aristides 'if (@NO)' отличается от 'if (NO)'. Первый проверяет, возвращает ли '[NSNumber numberWithBool: NO]' действительный объект (он делает). Последний фактически проверяет, является ли значение ложным. –

+0

Вот что я имел в виду. if (@literal) затем просто проверяет, возвращает ли он объект (который в любом случае был бы правильным), а если (NO) становится if (0) и, следовательно, фактическим предполагаемым тестом? – Aristides

1

@YES, @1, @1.5 ... это все буквальный синтаксис, которые являются эквивалентом NSNumber то есть: [NSNumber numberWithBool:YES], [NSNumber numberWithInt:1], [NSNumber numberWithDouble:1.5]. Используя это, вы создаете объект NSNumber.

YES - это просто тип BOOL, это примитивный тип в Obj-C, а не объект, такой как NSNumber. Тип BOOL используется в Objective-C для хранения истинных или ложных значений. Это то, что вы обычно использовали. Вы бы использовали только @YES в тех случаях, когда вам нужно удерживать примитивы в том, что только принимает объекты, возможно, если вы хотите их удерживать в NSArray, например.

1

Символ @ является недавним дополнением к Objective-C, которое изменяет литералы в их объектное представление в виде экземпляра NSNumber.

Это особенно полезно, если вам нужно хранить литералы в массивах и словарях, которые могут хранить только объекты (тип id).

Как вы его используете, нет необходимости создавать объект для литерала, поэтому вы должны просто использовать литерал напрямую.

Символ @ всегда использовался для обозначения объектов NSString, и только 2-3 года назад этот синтаксис был расширен для литералов и выражений.

+0

Я знаю, что вы имели в виду нечто иное, но * Символ @ является недавним дополнением к Objective-C *. '@' так же стара, как Objective-C. –

+0

@GabrielePetronella Я знаю, что вы имели в виду что-то другое, но * @ так же стара, как Objective-C *.'@' более 500 лет. – DrummerB

+0

@DrummerB touché :) –

Смежные вопросы