2012-06-26 3 views
1

Я знаю, используя синтаксис вроде этого:знак вопроса, как «если» обозначение

(something) ? TRUE : FALSE 

Но что, если я хочу, чтобы вернуть проверки переменной? Например:

if([myVar objectForKey:objectName]) 
    return [myVar objectForKey:objectName] 
else 
    return -1; 

Есть ли такой синтаксис, как первая строка кода, которая делает это?

Конечно я знаю, что я могу просто сделать что-то как:

([myVar objectForKey:objectName]) ? return [myVar objectForKey:objectName] : return -1; 

Но это AFAIK очень некрасиво решение

ответ

2

Off верхней части моей головы, я думаю это должно работать (EDIT: а см andyvn22 Ответим Re: возвращаемые типы):

id foo; 
return (foo = [myVar objectForKey:objectName]) ? foo : -1; 

Как общее правило, хотя, вы» почти всегда лучше использовать легко понятную нотацию, чем чуть более кратким, но загадочным.

+0

Этот синтаксис ТОЧНО, что я ищу. Но я должен объявить это за пределами своей инструкции * if *? Я не могу объявить его в * if *? – Kuba

+0

Не помню, как будут использоваться правила определения области видимости для такого объявления, но я не думаю, что это сработает. Вы могли бы попробовать и посмотреть? – walkytalky

+0

Вы правы, не работали;) – Kuba

2

я не уверен, что вы просите, но вы всегда можете сделать что-то вроде:

id foo = [myVar objectForKey:objectName]; 
return (foo) ? foo : -1; 

или

return [myVar objectForKey:objectName] ? [myVar objectForKey:objectName] : -1; 
+0

Возврат Oooo начинается. Спасибо, но я сомневаюсь в этом. Возможно, это тривиально, но лучше создать переменную (например, вы сделали в первой строке кода) или, возможно, получить объект из словаря дважды? Я знаю, что обе работы, но whitch лучше для памяти? – Kuba

+0

Я не думаю, что эффект на память будет слишком разным. В первом случае вы выделяете указатель на стек. Это всего 8 байт. Во втором случае вы дважды вызываете метод «objectForKey:». Это разница в производительности, но, вероятно, не большая, если она не находится внутри внутреннего цикла. – user1118321

+1

Вы правы, что последний пример * может * вызывать '-objectForKey:' дважды, но любые различия были бы настолько малы, что это абсурдно *, чтобы заботиться о них - используйте любой формат, который вам наиболее читабель *. Если бы мы обсуждали «return [myVar ridiculouslySlowMethod]? [myVar ridiculouslySlowMethod]: -1', * then * вы можете захотеть первой версии. – andyvn22

2

Там это простой способ использовать тройной оператор (это то, что называется, что ? : синтаксис) в return заявления:

return [myVar objectForKey:objectName] ? [myVar objectForKey:objectName] : -1; 

И это можно сделать более лаконичным с быстрым переменным:

id result = [myVar objectForKey:objectName]; 
return result ? result : -1; 

Однако! Какой у вас тип возврата здесь? Возможно, вы вернете [myVar objectForKey:objectName], который имеет тип id, или что вы вернете -1, который имеет тип NSInteger. Один объект Objective-C, а другой - примитив C - что-то кажется подозрительным с этим конкретным примером.

+0

Отличная точка – walkytalky

+0

Спасибо за имя! Теперь я знаю, что я ищу. Я знаю о типах. Это скорее общий вопрос, чем вопрос с возвращаемым типом. – Kuba