2014-10-08 4 views
0

Что делает следующий код?Тернарный оператор без ничего в состоянии «если»

return obj ? : [NSNull null]; 

Из моего понимания трехкомпонентных операций было бы эквивалентно:

if (!obj) 
    return [NSNull null]; 

Но что получает вернулся if (obj)? Доходит ли он до return [NSNull null]?

+0

Это нестандартное расширение GNU - см .: http://stackoverflow.com/questions/12420144/how-wide-spread-is-this-gnu-extension-on-ternary-operation –

ответ

3

Код ...

return foo ? : bar; 

Будет возвращено то же значение, что и ...

return foo ? foo : bar; 

Разница в том, что первый метод только один раз проверяет значение foo.

Лучше использовать первый в нескольких случаях.

Например, создание объекта ...

// this would create two objects, one to check and the other to return 
return [MyObject objectWithSomeParam:param] ? [MyObject objectWithSomeParam:param] : bar; 

или работает дорогостоящую функцию ...

// the expensive function here is run twice 
return [self someExpensiveFunction] ? [self someExpensiveFunction] : bar; 

Оба выиграют от использования

return foo ?: bar; 

по существу , если объект проверки совпадает с объектом возврата для true, то используйте сокращенную версию.

3

Если obj is True, obj возвращается.

return obj ? : [NSNull null]; 

эквивалентно:

id x = obj; 
if (x) { 
    return x; 
else { 
    return [NSNull null]; 
} 

Пока OBJ не имеет побочных эффектов, это логически эквивалентно:

return obj ? obj : [NSNull null] 
+1

, так что это то же самое как 'return obj? obj: [NSNull null] '? –

+0

Да, точно. Я добавлю это для справки. –

+1

Да, но это требует только одного осмотра объекта. Подумайте, была ли это дорогая функция, которая вернула bool. Метод в вашем комментарии будет запускать функцию дважды. – Fogmeister

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