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; } |
没有第一元素的三元(如
它是三元或条件运算符。它的基本形式是:
1 | condition ? valueIfTrue : valueIfFalse |
其中只有在选择值时才会对其进行评估。
简单地说,逻辑是
以巴里·沃克的精彩解释为基础…
三元运算符最重要的是它可以用于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特定的。以下是一份
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中:
所以假设你写:
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 } |
使用三元运算符
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 } |
等于
我们可以用
我刚刚学到了关于三元运算符的一些新知识。省略中间操作数的简短形式是非常优雅的,也是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; |