总之如果目标C

问题描述:

ELSE语法是否有任何短的语法,如PHP在Objective C中的if-else语句:总之如果目标C

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

较短的版本:

return $value?1:0; 
+0

'返回值1:0;'是一样'回报!值;' – 2014-01-10 04:03:41

+0

没有,有没有这样的事吗? Objective-C本身。但是Objective-C是建立在C上的,并且可以完全访问C语法/语义,C,C++,Java和其他几种语言中都有完全相同的语法。 PHP毫无疑问得到了来自C. – 2014-01-10 04:27:42

+2

FYI的构建,:' - 东西被称为[三运营商](http://en.wikipedia.org/wiki/Ternary_operation)。 – Regexident 2014-09-01 08:29:31

是的。

例(伪):

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

根据你的榜样(有效编码):

BOOL result = value ? YES : NO; 
+0

这使我的代码变得如此美观,整洁和复杂。谢谢! – 2015-06-22 02:41:42

+0

我这样使用它,并完美地工作:NSString * toRet = [dataToSave writeToFile:filePath atomically:NO]? @“是”:@“否”; – Septronic 2016-02-11 18:37:22

+1

@Alladinian:非常感谢 – 2016-07-28 11:59:39

这是一模一样在两种语言,除了通常在Objective-C变量名称中找不到$符号。

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

你也应该记住,条件运算?:不是一个if-else语句这么多,作为一个真正的缩写VS假表达的简写。请参阅PHP manual

+1

?:可在C和孩子中使用。它的意思是“这个或那个如果这是错误的”。 'int i = j?:k;'如果j是0,k将被分配。 – atomkirk 2014-02-18 20:12:39

+0

@atomkirk:有趣,所以它确实存在于PHP之外(并且工作原理相同)。我删除了我的错误陈述。 – BoltClock 2014-02-19 06:00:53

+0

?的另一个好处是:如果您想要执行如下操作,则仅评估一次“值”: “if value return value else return nil” – siburb 2015-01-13 07:48:15

三元运算符是上帝的礼物的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 2013-11-05 16:43:15

+0

我永远不会得到ObjC开发者对'if'的喜爱 - 也不会对他们的'{'成瘾。我同意,这很难阅读......如果你是英语教授。但它不是英语! – 2013-11-06 06:12:00

+0

@alexgray块通常不是免费的,所以如果你问为什么人们不按照惯例将多个语句折叠成单个语句,那就是原因。使用逗号试图将多个表达式塞进一个单独的语句在整个C派生的世界中被创造出来,以创建冗余的复杂性。你的第一个init甚至会与Objective-C惯例不正确地起作用。告诉我如果'[super init]'返回一个不同的类实例会发生什么情况,因为它明确可能会和可能会用于类集群? – Tommy 2014-01-10 04:00:57

惊讶,没有人建议如下:

  • 龙版本:

    if(value) 
        return 1; 
    else 
        return 0; 
    
  • 小版本:

    return value; 
    

如果value不是bool变量,只投它:return (BOOL)value;

+0

这是因为后者(小版本)是错的。至少对于旧的ObjC运行时和编译器。在这些'BOOL'上是'signed char'上的'typedef'。因为任何值大于255的值与较小的字节全部为零(例如'256')将导致“NO”而不是“YES”,因为转换为单字节的'signed char'会剥离更高,非零位。做'返回!!价值;'代替,或'返回值!=否;'。更多:http://nshipster.com/bool/ – Regexident 2014-09-01 08:38:00