В Objective-C, что делает запятая, когда используется как разделитель операторов?
Я смотрю хоть какой-то исходный код от третьей стороны и неоднократно вижу синтаксис, который для меня новичок. В основном они разделяют утверждения запятыми, а не точкой с запятой. Он компилируется и работает, но я не понимаю, что он делает. Это выглядит так
if(url)[url release], url = nil;
и они также используют его без if, иногда
[url release], url = nil;
Что здесь происходит?
Ответы
Ответ 1
Как и в C и С++, оператор запятой вычисляет вещь на левой стороне, а затем вычисляет вещь справа; общее значение выражения - это значение правой стороны. В принципе, это позволяет одному выражению делать две вещи (одна с левой стороны, предположительно, для побочных эффектов, таких как вызов или назначение метода). Да, синтаксис несколько неоднозначен с тем, что используется в вызовах функций и объявлениях переменных.
Я предпочитаю использовать честный блок, содержащий несколько операторов, где это возможно. Дольше, но в конечном счете чище. Легче отлаживать тоже.
Ответ 2
Это выражения, разделенные запятыми, и оцениваются слева направо, при этом результат всего выражения оценивается последним.
Ответ 3
Это одна из моих любимых "функций" C, ObjC и т.д.
Понимание этого оператора открывает всевозможные возможности для jQuery-like.chain-able.commands и более сжатое выражение (Меньше чем-то-аргумент-менее читаемое) МНОГО обычных идиом. Например...
-(id)init {
return self != super.init ? nil : [self setProperty:@"EPIC"],
NSLog(@"One line inits are: %@.", _property), self; }
LOG ➜ One line inits are: EPIC.