问号和冒号(?:三元运算符)在objective-c中的含义是什么?

dan*_*ser 266 c syntax objective-c operators conditional-operator

这行代码是什么意思?

label.frame = (inPseudoEditMode) ? kLabelIndentedRect : kLabelRect;
Run Code Online (Sandbox Code Playgroud)

?:迷惑我.

Bar*_*ark 426

这是C 三元运算符(Objective-C是C的超集):

label.frame = (inPseudoEditMode) ? kLabelIndentedRect : kLabelRect;
Run Code Online (Sandbox Code Playgroud)

在语义上等同于

if(inPseudoEditMode) {
 label.frame = kLabelIndentedRect;
} else {
 label.frame = kLabelRect;
}
Run Code Online (Sandbox Code Playgroud)

没有第一元素(例如variable ?: anotherVariable)的三元意味着相同(valOrVar != 0) ? valOrVar : anotherValOrVar

  • 值得一提的是,在左侧是表达式的情况下,没有第一个元素(`?:`)的三元运算符*甚至更好*,因为`?:`阻止它被多次计算.例如:`[myArray firstObject]?[myArray firstObject]:@"Hello World";`两次调用`firstObject`(如果`firstObject`不返回`nil`),其中`[myArray firstObject]?:@"Hello World";`产生相同的结果但是永远不会多次调用`firstObject`. (42认同)
  • (更新:Yuck!重新发布作为答案.)三元运算符的重要之处在于它可以在if-else不能使用的地方使用.即:在条件或方法参数内.[NSString stringWithFormat:@"状态:%@",(statusBool?@"已批准":@"已拒绝")] ...这对预处理器常量非常有用:#define statusString(statusBool?@"Approved":@ "拒绝")...然后:[NSString stringWithFormat:@"Status:%@",statusString]这使您不必在if-else模式中使用和释放局部变量.FTW! (28认同)

Sea*_*ean 176

它是三元或条件运算符.它的基本形式是:

condition ? valueIfTrue : valueIfFalse
Run Code Online (Sandbox Code Playgroud)

只有在选择值时才会评估值.

  • 只是为了澄清,它不仅限于价值观.`条件?codeIfTrue:codeIfFalse` (8认同)

Var*_*yal 43

简单来说,逻辑就是

(condition) ? {code for YES} : {code for NO}

  • 这实际上是**最好的答案,因为其他答案意味着你只能得到一个"值",而这表明你可以放任意代码作为结果. (4认同)

Bru*_*sky 36

以Barry Wark的优秀解释为基础......

三元运算符的重要之处在于它可以用在if-else不能的地方.即:在条件或方法参数内.

[NSString stringWithFormat: @"Status: %@", (statusBool ? @"Approved" : @"Rejected")]
Run Code Online (Sandbox Code Playgroud)

...这对预处理器常量非常有用:

// in your pch file...
#define statusString (statusBool ? @"Approved" : @"Rejected")

// in your m file...
[NSString stringWithFormat: @"Status: %@", statusString]
Run Code Online (Sandbox Code Playgroud)

这使您不必在if-else模式中使用和释放局部变量.FTW!


Bri*_*ian 13

那只是通常的三元运营商.如果问号前面的部分为true,则计算并返回冒号前的部分,否则计算并返回冒号后的部分.

a?b:c
Run Code Online (Sandbox Code Playgroud)

就好像

if(a)
    b;
else
    c;
Run Code Online (Sandbox Code Playgroud)