2012-03-21 6 views
32

Есть ли короткий синтаксис если-то еще утверждение в объективном C, как PHP:Short IF ELSE синтаксис в объективном C

if($value) 
return 1; 
else 
return 0; 

короткая версия:

return $value?1:0; 
+0

'возвращает значение 1: 0;' такой же, как 'возврата !! значение;' –

+0

Нет, нет такой вещи, в? Objective-C. Но Objective-C построен на C и имеет полный доступ к синтаксису/семантике C, и тот же синтаксис присутствует в C, C++, Java и некоторых других языках. PHP, без сомнения, получил конструкцию от C. –

+2

FYI, '?: '-thing называется [тройной оператор] (http://en.wikipedia.org/wiki/Ternary_operation). – Regexident

ответ

104

Да.

Пример (псевдо):

value = (expression) ? (if true) : (if false); 

Основываясь на вашем примере (действительный код):

BOOL result = value ? YES : NO; 
+0

Это делает мой код таким хорошим, аккуратным и утонченным. Благодаря! –

+0

Я использовал его вот так и отлично работал: NSString * toRet = [dataToSave writeToFile: filePath atomically: NO]? @"Да нет"; – Septronic

+1

@Alladinian: thanks alot –

13

Это точно так же в оба языка, за исключением того, что вы обычно не находите знаки $ в именах переменных Objective-C.

if(value) 
return 1; 
else 
return 0; 
return value?1:0; 

Вы также должны иметь в виде, что условный оператор ?: не обобщающий для если-иначе заявлений так много, как сокращение для истинного против ложного выражения. См. PHP manual.

+1

?: Доступен в C и для детей. Это означает «то или это, если это ложно». 'int i = j?: k;' Если j равно 0, будет назначен k. – atomkirk

+0

@atomkirk: Интересно, поэтому он существует вне PHP (и работает одинаково). Я удалил свое ошибочное заявление. – BoltClock

+0

Другое преимущество?: Заключается в том, что «значение» оценивается только один раз, если, например, вы хотите сделать что-то вроде: «if value return value else return nil» – siburb

-9

тройного оператор Божий дар Objective-C (/мира). Некоторые примеры ..

/* if super.init worked, set a property and return self, else return nil. */ 
- init { return self = super.init ? _intProperty = 99, self : nil; } 

/* simple static initializers. no dispatch_once drama. if nil, set it! */ 
static NSArray *array = nil; array = array ?: [someOtherArray copy]; 

/* act on your conditions without messy switches, needless line breaks and punctuation, etc. 
    if you need to do more than one thing, wrap it in an anonymous block! */ 
anInt == SomeENUM ? [do something]  : 
anInt == AlsoENUM ? [do somethingElse] : 
anInt == BlahENUM ? ({ int x = 999; 
         [do anotherThingEntirely:x]; }) 
        : nil; // no match, keep going! 

/* Don't create separate function calls, tailor your call to your condition */ 
BOOL val = YES; NSLog(@"I %@ repeating myself.", val ? @"HATE" : @"LOVE"); 

/* property getters, etc... SOO easy with ternary initializers! just return! */ 
- property { return _property = _property ?: ^{ // if set, return backing ivar.. 
    /* otherwise, set it and return it from a block. */ 
    /* ...your crazy init sequence goes here... */ return _property }(); 
} 

/* Use commas to do stuff! Only the last value is returned! */ 
- (BOOL) isIt { return _isIt ?: NSLog(@"Only logs if _itIs true", nil), _isIt; } 
+3

Этот код такой плохой, мне нужно -1. Тернарный оператор полезен, но вложенные троичные операторы просто беспорядок. Первая строка - худшая. – Sulthan

+0

Я никогда не узнаю любовный роман разработчиков ObjC с 'if' - и их зависимость от' {'. Я согласен, это труднее читать ... если вы английский профессор. Но это не английский! –

+0

Блоки @alexgray обычно не являются бесплатными, поэтому, если вы спрашиваете, почему люди не используют их, как обычно, чтобы свернуть несколько операторов до одного оператора, вот почему. Использование запятой, чтобы попытаться втиснуть несколько выражений в один оператор, неодобрительно воспринимается во всем мире C-типа для создания избыточной сложности. Ваша первая инициализация даже работает некорректно в сравнении с соглашениями Objective-C. Скажите мне, что произойдет, если '[super init]' возвращает другой экземпляр класса, поскольку он явно может и, вероятно, будет для кластера классов? – Tommy

1

Удивлен, что никто не предложил следующее:

  • Длинная версия:

    if(value) 
        return 1; 
    else 
        return 0; 
    
  • Облегченная версия:

    return value; 
    

И если value не bool переменный, просто бросьте: return (BOOL)value;

+0

Это потому, что последняя (небольшая версия) просто неверна. По крайней мере для старых исполняемых файлов ObjC и компиляторов. На этих 'BOOL' есть' typedef' на 'signed char'. Таким образом, любое значение со значением, превышающим 255 с младшим байтом, все нули (например, '256') приведут к' NO', вместо 'YES', поскольку приведение к однобайтовому' подписанному символу ' выше, отличных от нуля. Вместо 'return !! value;' или 'return value! = NO;'. Подробнее: http://nshipster.com/bool/ – Regexident