Код ...
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, то используйте сокращенную версию.
Это нестандартное расширение GNU - см .: http://stackoverflow.com/questions/12420144/how-wide-spread-is-this-gnu-extension-on-ternary-operation –