Objective C三元运算符给出错误:ARC不允许隐式转换为'void'

时间:2014-03-04 20:32:41

标签: objective-c xcode

我发现当我使用三元运算符时,Xcode的当前生产版本给了我一个错误:

//If address.title is not nil, leave it alone. Else, set it to @"".
address.title   ?: [address setTitle:@""];
address.street  ?: [address setStreet:@""];

当我使用Xcode 5.1的beta预览时,我没有得到这样的警告。是什么给了什么?

2 个答案:

答案 0 :(得分:1)

"Conditionals with Omitted Operands"是GCC扩展(Clang也理解), 和

address.title ? : [address setTitle:@""];

相当于

address.title ? address.title : [address setTitle:@""]; 

唯一的区别是address.title只评估一次。

现在第二个操作数有指针类型(NSString *)和 第三个运算符具有void类型。在这种情况下,条件的结果类型 表达式为void,但ARC不允许将NSString *隐式转换为void。这将编译:

 address.title ? (void)0: [address setTitle:@""];

但是,正如Merlevede所说,使用明确的if语句会更清楚。

如果Xcode 5.1的beta预览版中包含的编译器没有出错 那么它可能是编译器中的一个错误。当然它也可能是另一种语言 我不知道的延伸!

答案 1 :(得分:0)

您的语法错误

 address.title   ?: [address setTitle:@""];

应该是

 address.title =  (address.title)? address.title : @"";
 // or
 [address setTitle:((address.title)? address.title : @"")];

一般语法是

 var = (condition) ? value_if_true : value_if_false;  // general syntax

在你的情况下,最好做

if (!address.title)
    address.title = @"";