Objective-C:"id =(property)?property:defaultObject;"的快捷方式 - 它存在吗?

tob*_*pwn 0 objective-c clang ios

一个相当常见的模式是:如果存在某个对象,我想在我的代码中使用该对象,但如果没有设置,我想要故障转移到某个默认值.

使用背景图像作为示例,并假设UIImage *backgroundImage在评估此代码时可能设置或不设置某些属性,执行此操作的详细方法可能是:

UIImage *image;
if (self.backgroundImage) {
    image = self.backgroundImage;
} else {
    image = [UIImage imageNamed:@"default"];
}
Run Code Online (Sandbox Code Playgroud)

更紧凑的方法是:

UIImage *image = (self.backgroundImage) ? self.backgroundImage : [UIImage imageNamed:@"default"];
Run Code Online (Sandbox Code Playgroud)

我的问题是:是否有更简洁的方法来实现这一目标?

就像是:

UIImage *image = self.backgroundImage || [UIImage imageNamed:@"default"];
Run Code Online (Sandbox Code Playgroud)

我在Clang Literals文档中找不到任何内容,但这种简写实际上可能不会被视为"文字",甚至可能成为Clang的一部分.

(我也不确定Clang/LLVM的"(真值陈述)?id1:id2"语法在哪里;知道那些简短陈述的详尽集合在哪里也会很棒!)

mat*_*att 7

UIImage *image = (self.backgroundImage) ? self.backgroundImage : [UIImage imageNamed:@"default"];
Run Code Online (Sandbox Code Playgroud)

我的问题是:是否有更简洁的方法来实现这一目标?

是; 只是省略中期:

UIImage *image = self.backgroundImage ? : [UIImage imageNamed:@"default"];
Run Code Online (Sandbox Code Playgroud)

记录在这里.

现在,在Swift中,??运算符可以完成?:操作符在Objective-C中所做的操作.

  • 如果链接不清楚:这是gng语言扩展,clang也支持. (2认同)