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

What does the question mark and the colon (?: ternary operator) mean in objective-c?

这行代码是什么意思?

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

江户十一〔0〕和江户一〔1〕把我弄糊涂了。


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

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

在语义上等价于

1
2
3
4
5
if(inPseudoEditMode) {
 label.frame = kLabelIndentedRect;
} else {
 label.frame = kLabelRect;
}

没有第一元素的三元(如variable ?: anotherVariable)表示与(valOrVar != 0) ? valOrVar : anotherValOrVar相同。


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

1
condition ? valueIfTrue : valueIfFalse

其中只有在选择值时才会对其进行评估。


简单地说,逻辑是

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


以巴里·沃克的精彩解释为基础…

三元运算符最重要的是它可以用于if-else不能使用的地方。ie:在条件或方法参数内。

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

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

1
2
3
4
5
// in your pch file...
#define statusString (statusBool ? @"Approved" : @"Rejected")

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

这样可以避免在if-else模式中使用和释放局部变量。FTW!


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

1
a?b:c

就像

1
2
3
4
if(a)
    b;
else
    c;

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

1
2
3
4
if(inPseudoEditMode)
  label.frame = kLabelIndentedRect;
else
  label.frame = kLabelRect;


这是C的一部分,所以它不是客观C特定的。以下是一份if声明的翻译:

1
2
3
4
if (inPseudoEditMode)
    label.frame = kLabelIndentedRec;
else
    label.frame = kLabelRect;

有趣的事实,如果你想检查空/空例如:

1
2
3
4
5
6
7
8
-(NSString*) getSomeStringSafeCheck
{
    NSString *string = [self getSomeString];
    if(string != nil){
        return String;
    }
    return @"";
}

快速的方法是:

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

然后您可以用最简单的方法更新它:

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

因为在目标C中:

  • 如果一个对象为零,它将作为布尔值返回false;
  • 三元运算符的第二个参数可以为空,因为它将返回"?"左侧的结果。
  • 所以假设你写:

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

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


    Ternary operator example.If the value of isFemale
    boolean variable is YES, print"GENDER IS FEMALE" otherwise"GENDER IS
    MALE"

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

    Objtovi-C

    1
    2
    3
    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.

    为斯威夫特

    1
    2
    3
    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.

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

    1
    2
    3
    4
    5
    6
    if (condition){
        true
    }
    else {
        false
    }

    使用三元运算符(condition)? true:false。为了增加额外的信息,在Swift中,我们有了使用??表示它的新方法。

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

    它类似于

    1
    2
    3
    4
    5
    6
    7
    int a = 6, c= 5;
    if (a > c)
    {
     a is greater
    } else {
     c is greater
    }

    等于

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

    我们可以用??来代替?:,它是快速的。


    我刚刚学到了关于三元运算符的一些新知识。省略中间操作数的简短形式是非常优雅的,也是C保持相关的众多原因之一。仅供参考,我第一次真正了解这一点是在C中实现的一个例程的上下文中进行的,它也支持三元运算符。由于三元运算符是用C表示的,因此它可以用其他语言表示,这些语言本质上是其扩展(例如,objective-c、c)。


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

    方法

    1
    2
    3
    4
    5
    int padding;
    if ([[UIScreen mainScreen] bounds].size.height <= 480)
      padding = 15;
    else
      padding = 55;

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

    1
    2
    3
    4
    5
    6
    if(a > b) {
    what to do;
    }
    else {
    what to do;
    }

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

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