【问题标题】:What does the question mark and the colon (?: ternary operator) mean in objective-c?问号和冒号(?:三元运算符)在objective-c中是什么意思?
【发布时间】:2011-02-05 10:15:07
【问题描述】:

这行代码是什么意思?

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

?: 让我很困惑。

【问题讨论】:

  • 是三元if-then-else运算符
  • 注意这里应该是问号,而不是引号。
  • 编译器好像也允许variable ?: anotherVariable,这是什么意思?'
  • 没有第一个元素的三元同(valOrVar != 0) ? valOrVar : anotherValorvar

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


【解决方案1】:

这是 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的含义相同

【讨论】:

  • (更新:呸!转帖作为答案。)三元运算符的重要之处在于它可以用于 if-else 无法使用的地方。即:在条件或方法参数内。 [NSString stringWithFormat: @"Status: %@", (statusBool ?@"Approved" : @"Rejected")] ...这对预处理器常量很有用:#define statusString (statusBool ?@"Approved" :@ "Rejected") ...then: [NSString stringWithFormat: @"Status: %@", statusString] 这使您不必在 if-else 模式中使用和释放局部变量。 FTW!
  • 可能值得一提的是,没有第一个元素的三元运算符 (?:) 在左侧是表达式的情况下甚至更好,例如 @987654328 @ 防止它被多次评估。例如:[myArray firstObject] ? [myArray firstObject] : @"Hello World"; 调用firstObject 两次(如果firstObject 不返回nil),其中[myArray firstObject] ?: @"Hello World"; 产生相同的结果,但从不多次调用firstObject
  • 终于~~~~~ 我已经使用这个操作符很久了(我最喜欢的),但从来不知道它叫什么。现在已经回答了这个大问题。谢谢
  • 还想补充一点,没有第一个元素的三元运算符?: 也称为Elvis operator,因为emoji 与歌手相似。当然,在这种情况下,当我们删除一个元素时,它不再是 三元运算符,而是 二元运算符。二元运算符包括我们编程时常用的绝大多数运算符(*,+,-,^,|,||,&,>>等)。
【解决方案2】:

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

condition ? valueIfTrue : valueIfFalse

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

【讨论】:

  • 只是为了澄清,它不限于价值观。 condition ? codeIfTrue : codeIfFalse
【解决方案3】:

简单地说,逻辑是

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

【讨论】:

  • 这实际上是 最佳 答案,因为其他答案暗示您只能获得一个“值”作为结果,而这表明您可以将任意代码作为结果。
【解决方案4】:

以 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!

【讨论】:

    【解决方案5】:

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

    a?b:c
    

    就像

    if(a)
        b;
    else
        c;
    

    【讨论】:

      【解决方案6】:

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

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

      【讨论】:

        【解决方案7】:

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

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

        【讨论】:

          【解决方案8】:

          有趣的事实,在 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 为布尔值;
          2. 三元运算符的第二个参数可以为空,因为它会返回'?'左边的结果

          假设你写:

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

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

          【讨论】:

            【解决方案9】:

            三元运算符示例。如果 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.
            

            对于斯威夫特

            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.
            

            【讨论】:

              【解决方案10】:

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

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

              在三元运算符中是这样的: 健康)状况 ?如果条件为真怎么办:如果条件为假怎么办;

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

              【讨论】:

              • 感谢您尝试为网站做出贡献,但通常不鼓励发布简单重复其他答案的答案,因为它只会使问题变得混乱。
              【解决方案11】:

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

              【讨论】:

                【解决方案12】:

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

                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

                我们可以使用?? 来代替?: 是swift。

                【讨论】:

                  【解决方案13】:
                  int padding = ([[UIScreen mainScreen] bounds].size.height <= 480) ? 15 : 55;
                  

                  意思

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

                  【讨论】:

                    猜你喜欢
                    • 2015-04-05
                    • 2012-09-25
                    • 2014-04-26
                    • 1970-01-01
                    • 1970-01-01
                    • 2019-09-14
                    • 2020-04-30
                    • 2012-01-26
                    相关资源
                    最近更新 更多