问号和冒号(?:三元运算符)在Objective-C中是什么意思?


270

这行代码是什么意思?

label.frame = (inPseudoEditMode) ? kLabelIndentedRect : kLabelRect;

?:迷惑我。


1
这是三元的if-then-else的运营商
克劳斯Byskov佩德森

3
请注意,这应该是问号,而不是引号。
clahey

6
编译器似乎也允许variable ?: anotherVariable,这意味着什么?
托尼

15
没有第一个元素的三元含义与(valOrVar != 0) ? valOrVar : anotherValorvar
Scott Lahteine

Answers:


430

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

label.frame = (inPseudoEditMode) ? kLabelIndentedRect : kLabelRect;

在语义上等同于

if(inPseudoEditMode) {
 label.frame = kLabelIndentedRect;
} else {
 label.frame = kLabelRect;
}

没有第一个元素(例如variable ?: anotherVariable)的三进制表示与(valOrVar != 0) ? valOrVar : anotherValOrVar


28
(更新:很糟糕!作为答案重新发布。)关于三元运算符,最重要的是它可以在if-else无法使用的地方使用。即:在条件或方法参数内。[NSString stringWithFormat:@“状态:%@”,(statusBool?@“已批准”:@“被拒绝”)] ...这对于预处理程序常量很有用:#define statusString(statusBool?@“已批准”:@ “已拒绝”)...然后:[NSString stringWithFormat:@“状态:%@”,statusString]这使您不必以if-else模式使用和释放局部变量。FTW!
布鲁诺·布罗诺斯基

42
可能值得一提的?:是,在左侧为表达式的情况下,不带第一个元素()的三元运算符甚至更好,这是因为?:防止对其进行多次评估。例如:[myArray firstObject] ? [myArray firstObject] : @"Hello World";调用firstObject两次(如果firstObject未返回nil),则[myArray firstObject] ?: @"Hello World";产生相同的结果,但从未调用firstObject过一次。
nhgrif 2014年

终于~~~~~我已经使用这个运算符很长时间了(我最喜欢的),但是却不知道它叫什么。现在已经回答了这个大问题。谢谢
Thang Do

还需要补充一点,由于与歌手的表情符号相似,没有第一个元素的三元运算符?:也称为猫王运算符。当然,在这种情况下,当我们删除一个元素时,它不再是三元运算符,而是二进制运算符。二元运算符包括绝大多数我们在编程时通常使用(经营者,,,,,,,,等)。*+-^|||&>>
tomacco

179

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

condition ? valueIfTrue : valueIfFalse

仅在选择了值的情况下才评估值。


8
只是为了澄清,它不仅限于值。condition ? codeIfTrue : codeIfFalse
Mike S

46

简单来说,逻辑就是

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


4
这实际上是最佳答案,因为其他答案暗示您只能得到一个“值”,而这表明您可以放入任何任意代码。
Mike S

36

以Barry Wark的出色解释为基础...

三元运算符的重要意义在于可以在if-else无法使用的地方使用它。即:在条件或方法参数内。

[NSString stringWithFormat: @"Status: %@", (statusBool ? @"Approved" : @"Rejected")]

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

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

// in your m file...
[NSString stringWithFormat: @"Status: %@", statusString]

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


14

那只是通常的三元运算符。如果问号之前的部分为真,则它求值并返回冒号之前的部分,否则,它求值并返回冒号之后的部分。

a?b:c

就好像

if(a)
    b;
else
    c;

4

这是C的一部分,因此它不是特定于Objective-C的。这是if语句的翻译:

if (inPseudoEditMode)
    label.frame = kLabelIndentedRec;
else
    label.frame = kLabelRect;

4

这只是编写if-then-else语句的一种简短形式。它的含义与以下代码相同:

if(inPseudoEditMode)
  label.frame = kLabelIndentedRect;
else
  label.frame = kLabelRect;

2

三元运算符示例。如果isFemale布尔变量的值为YES,则打印“ GENDER IS FEMALE”,否则打印“ GENDER IS MALE”

? means = execute the codes before the : if the condition is true. 
: means = execute the codes after the : if the condition is false.

物镜

BOOL isFemale = YES;
NSString *valueToPrint = (isFemale == YES) ? @"GENDER IS FEMALE" : @"GENDER IS MALE";
NSLog(valueToPrint); //Result will be "GENDER IS FEMALE" because the value of isFemale was set to YES.

对于斯威夫特

let isFemale = false
let valueToPrint:String = (isFemale == true) ? "GENDER IS FEMALE" : "GENDER IS MALE"
print(valueToPrint) //Result will be  "GENDER IS MALE" because the isFemale value was set to false.

2

有趣的是,如果要检查null / nil,请在Objective-c中进行检查,例如:

-(NSString*) getSomeStringSafeCheck
{
    NSString *string = [self getSomeString];
    if(string != nil){
        return String;
    }
    return @"";
}

快速的方法是:

-(NSString*) getSomeStringSafeCheck
{
    return [self getSomeString] != nil ? [self getSomeString] : @"";
}

然后,您可以将其更新为最简单的方法:

-(NSString*) getSomeStringSafeCheck
{
    return [self getSomeString]?: @"";
}

因为在Objective-C中:

  1. 如果对象为nil,则将布尔值返回false;
  2. 三元运算符的第二个参数可以为空,因为它将返回'?'左侧的结果。

所以说你写:

[self getSomeString] != nil?: @"";

第二个参数返回一个布尔值,因此引发异常。


1

它是三元运算符,类似于if / else语句。

if(a > b) {
what to do;
}
else {
what to do;
}

在三元运算符中是这样的:condition?如果条件为真,该怎么办:如果条件为假,该怎么办;

(a > b) ? what to do if true : what to do if false;

2
非常感谢您尝试为该网站做出贡献,但是通常不建议发布仅重复其他答案的答案,因为这只会使问题变得混乱。
克里斯·海斯

1

我刚刚学到了有关三元运算符的新知识。省略中间操作数的缩写形式确实很优雅,并且是C保持相关性的众多原因之一。仅供参考,在C#中实现的例程的背景下,我首先真正意识到了这一点,该例程还支持三元运算符。由于三元运算符使用C语言,因此可以推断,它实际上是其他语言的扩展(例如,Objective-C,C#)。


1

众所周知,这是一种表示条件运算符的方式

if (condition){ 
    true 
} 
else {
    false
}

使用三元运算符(condition)? true:false 要添加其他信息,我们迅速使用来表示它??

let imageObject: UIImage = (UIImage(named: "ImageName")) ?? (initialOfUsername.capitalizedString).imageFromString

类似于

int a = 6, c= 5;
if (a > c) 
{ 
 a is greater
} else {
 c is greater
}

相当于

if (a>c)?a:c ==>等于 if (a>c)?:c

而不是?:我们可以??迅速使用。


1
int padding = ([[UIScreen mainScreen] bounds].size.height <= 480) ? 15 : 55;

手段

int padding; 
if ([[UIScreen mainScreen] bounds].size.height <= 480)
  padding = 15;
else
  padding = 55; 
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.