2012-03-21 9 views
32

C'è qualche sintassi abbreviazione di if-else in Objective C come PHP:Breve IF sintassi ELSE in Objective C

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

versione più breve:

return $value?1:0; 
+0

'valore di ritorno 1: 0;' è uguale valore 'ritorno !!;' –

+0

No, non c'è nulla di simile a? Obiettivo-C stesso. Ma Objective-C è costruito su C e ha pieno accesso alla sintassi/semantica C, e la stessa sintassi è presente in C, C++, Java e in molti altri linguaggi. PHP ha indubbiamente ottenuto il costrutto da C. –

+2

FYI, il '?: '-thing è chiamato [operatore ternario] (http://en.wikipedia.org/wiki/Ternary_operation). – Regexident

risposta

104

Sì.

Esempio (pseudo):

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

Basato sul tuo esempio (codice valido):

BOOL result = value ? YES : NO; 
+0

Ciò rende il mio codice così bello, ordinato e sofisticato. Grazie! –

+0

L'ho usato in questo modo e ha funzionato perfettamente: NSString * toRet = [dataToSave writeToFile: filePath atomicamente: NO]? @"Si No"; – Septronic

+1

@Alladinian: grazie mille –

13

E 'esattamente la stessa in entrambe le lingue, tranne che in genere non si trovano i segni $ nei nomi delle variabili Objective-C.

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

Si deve anche tenere a mente che l'operatore condizionale ?: non è una scorciatoia per un'istruzione if-else tanto come una scorciatoia per un vero vs falsa espressione. Vedi lo PHP manual.

+1

?: È disponibile in C e bambini. Significa "questo o quello se questo è falso". 'int i = j?: k;' Se j è 0, k sarà assegnato. – atomkirk

+0

@atomkirk: Interessante, quindi esiste al di fuori di PHP (e funziona in modo identico). Ho rimosso la mia affermazione errata. – BoltClock

+0

L'altro vantaggio di?: È che "valore" viene valutato solo una volta se ad esempio si desidera fare qualcosa del tipo: "se valore restituisce il valore altrimenti restituisce nil" – siburb

-9

l'operatore ternario è dono di Dio per Objective-C (/il mondo). Alcuni esempi ..

/* 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

Questo codice è così cattivo, devo -1. L'operatore ternario è utile ma gli operatori ternari annidati sono solo un casino. La prima riga è la peggiore. – Sulthan

+0

Non capirò mai la storia d'amore degli sviluppatori di ObjC con "if" - né la loro dipendenza da "{". Sono d'accordo, è più difficile da leggere ... se sei un professore di inglese. Ma non è inglese! –

+0

I blocchi @alexgray di solito non sono gratuiti, quindi se ti stai chiedendo perché le persone non li usano come fai abitualmente per comprimere più istruzioni in una singola istruzione, ecco perché. L'uso della virgola per provare a racchiudere più espressioni in una singola istruzione è disapprovato attraverso il mondo derivato da C per creare complessità ridondante. Il tuo primo init funziona anche in modo errato rispetto alle convenzioni Objective-C. Dimmi cosa succede se '[super init]' restituisce un'istanza di classe diversa, come potrebbe esplicitamente e probabilmente per un cluster di classe? – Tommy

1

sorpreso che nessuno ha suggerito la seguente:

  • Versione lunga:

    if(value) 
        return 1; 
    else 
        return 0; 
    
  • piccola versione:

    return value; 
    

E se value non è una variabile bool, basta lanciarlo: return (BOOL)value;

+0

Questo perché la seconda versione (piccola) è semplicemente sbagliata. Almeno per i vecchi runtime e compilatori ObjC. Su quei 'BOOL' è un' typedef' su 'signed char'. In quanto tale qualsiasi valore con un valore maggiore di 255 con il byte più piccolo tutti gli zero (come '256') risulterebbe in' NO', invece di 'YES', poiché il cast di un' byte firmato 'di un singolo byte più alto, non zero bit di distanza. Do 'return !! value;' invece, o 'restituisce valore! = NO;'. Altro: http://nshipster.com/bool/ – Regexident