Для этого есть еще один полезный случай - исключение промежуточных переменных при вызове функции или метода, который может вернуть nil, который мы хотим избежать вызова дважды. Например, (Objective-C), предположим, что мы хотим распаковать файл в массив, если он существует, в противном случае вернуть пустой массив.
- (NSArray*)hydrateBacklogFromFile:(NSString *path)
{
NSArray *backlog = @[];
NSData *backlogData = [NSData dataWithContentsOfFile:path];
if (backlogData)
{
backlog = [NSKeyedUnarchiver unarchiveObjectWithData:backlogData] ?: backlog;
}
return backlog;
}
Альтернативы менее лаконичны.
- (NSArray*)hydrateBacklogFromFile:(NSString *path)
{
NSArray *backlog = @[];
NSData *backlogData = [NSData dataWithContentsOfFile:path];
if (backlogData)
{
NSArray *tempArray = [NSKeyedUnarchiver unarchiveObjectWithData:backlogData];
if (tempArray != nil)
{
backlog = tempArray;
}
}
return backlog;
}
Или более уродливый с множественным возвратом и т. Д.
- (NSArray*)hydrateBacklogFromFile:(NSString *path)
{
NSData *backlogData = [NSData dataWithContentsOfFile:path];
if (backlogData)
{
NSArray *tempArray = [NSKeyedUnarchiver unarchiveObjectWithData:backlogData];
if (tempArray != nil)
{
return tempArray;
}
}
return @[];
}
Так что это полезный синтаксический сахар, который я нахожу довольно читабельным. Минусы
Неявное преобразование указателя в bool. Это давний C
условно, но большинство современных языков это запрещают, усложняя
любые усилия по переносу.
Как уже говорили другие, это также нестандартное расширение, поэтому оно должно
следует избегать, если переносимость является фактором вообще.