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

时间:2010-04-07 19:44:04

标签: objective-c c syntax operators conditional-operator

这行代码意味着什么?

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

?:让我感到困惑。

13 个答案:

答案 0 :(得分:418)

这是C ternary operator(Objective-C是C的超集):

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

在语义上等同于

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

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

相同

答案 1 :(得分:174)

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

condition ? valueIfTrue : valueIfFalse

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

答案 2 :(得分:40)

简单来说,逻辑就是

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

答案 3 :(得分: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!

答案 4 :(得分:13)

这就是通常的ternary operator。如果问号前面的部分为真,它会在冒号之前计算并返回该部分,否则它会计算并返回冒号后的部分。

a?b:c

就像

if(a)
    b;
else
    c;

答案 5 :(得分:4)

这是C的一部分,所以它不是Objective-C特有的。这是if声明的翻译:

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

答案 6 :(得分:4)

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

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

答案 7 :(得分:2)

  

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

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

目标-C

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.

对于Swift

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.

答案 8 :(得分:2)

有趣的事实,在objective-c中,如果你想检查null / nil 例如:

-(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为boolean;
  2. 三元运算符的第二个参数可以为空,因为它会返回'左边的结果?'
  3. 所以,请你写一下:

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

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

答案 9 :(得分:1)

它是三元运算符,就像if / else语句一样。

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

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

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

答案 10 :(得分: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; 

答案 11 :(得分:1)

我刚刚学到了关于三元运算符的新知识。省略中间操作数的简短形式是真正优雅的,并且是C仍然相关的众多原因之一。仅供参考,我首先在C#中实现的例程中完全理解这一点,C#也支持三元运算符。由于三元运算符在C中,因此它可以在其他语言中实际上是其扩展(例如,Objective-C,C#)。

答案 12 :(得分:1)

正如大家所说,这是一种表示条件运算符的方法

if (condition){ 
    true 
} 
else {
    false
}

使用三元运算符(condition)? true:false 要添加其他信息,在swift中我们有了使用??表示它的新方法。

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 ==&gt;等于if (a>c)?:c

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