我想知道为什么我的代码不能像我想的那样工作。请考虑以下代码:
- (NSString *)bake {
return [NSString stringWithFormat:(@"Take %@, put it in oven for 30 minutes, add 250 gramm of %@ cheese, many %@ toppings and little drop of %@ sauce", [self dough], [self cheese], [self toppings], [self sauce])];
}
- (NSString *)cut {
return [NSString stringWithFormat:(@"Cut in 4 pieces")];
}
- (NSString *)box {
return [NSString stringWithFormat:(@"Box pizza. Ready for sale!")];
}
- (NSString *)orderString {
return [NSString stringWithFormat:@"%@ %@ %@", [self bake], [self cut], [self box]];
}
非常简单。现在,控制台中的输出结果是(orderString
包含的内容):
Tobasko Cut in 4 pieces Box pizza. Ready for sale!
由于某种原因,我们只得到bake NSString
中包含的文字的最后一句话。编译器甚至警告这行代码用2"黄色"警告:
格式字符串不是字符串文字(可能不安全)
表达结果未使用
我只是通过删除圆括号来解决这个问题:
return [NSString stringWithFormat:@"Take %@, put it in oven for 30 minutes, add 250 gramm of %@ cheese, many %@ toppings and little drop of %@ sauce", [self dough], [self cheese], [self toppings], [self sauce]];
但是,我不明白,为什么编译器在将括号括在圆括号中时会截断我的字符串?
答案 0 :(得分:4)
括号(不是圆括号)将其中的所有内容分组为表达式。更改某些运算符的优先级或使代码更具可读性非常有用。
在基于C语言(包括Objective-C)中,一系列逗号分隔表达式的值是列表中最后一个表达式的值。
您的行中的括号最终将单独的参数分组为stringWithFormat:
方法,而不是预期的单独参数集。
所以价值:
(@"Take %@, put it in oven for 30 minutes, add 250 gramm of %@ cheese, many %@ toppings and little drop of %@ sauce", [self dough], [self cheese], [self toppings], [self sauce])
只是最后一个的值:
[self sauce]
所以在影响中,你的路线真的只是:
return [NSString stringWithFormat:[self sauce]];
这就是为什么你得到两个警告以及为什么它只返回Tobasko
。
此外,NSString stringWithFormat:
的使用应始终至少有两个参数。第一个应该是一个至少有一个格式说明符的字符串,其余的参数应该对应于格式字符串中的每个格式说明符。
所以代码如下:
return [NSString stringWithFormat:(@"Cut in 4 pieces")];
有两个问题。 1.毫无意义的括号和2.没有必要使用stringWithFormat:
。只需使用:
return @"Cut in 4 pieces";
答案 1 :(得分:2)
我想要了解正在发生的事情,我们需要将其分解为三个方面:
[NSString stringWithFormat:]
需要1个或多个参数。您只能传入一个字符串,没有其他参数,它将只返回该字符串。如果您在字符串中有格式描述符(例如%@
,%d
等),则需要匹配数量的附加参数。但同样,没有格式描述符的单个字符串是有效参数。
括号()表示首先应评估括号内的内容,然后将其用作单个表达式
C中的逗号运算符大致意味着“从左到右评估这些表达式并返回最右边表达式的值”
http://crasseux.com/books/ctutorial/The-comma-operator.html
所以你的“烘焙”方法会发生什么:
[self sauce]
,其值为@"Tabasko"
)[NSString stringWithFormat:]
的参数,即[NSString stringWithFormat:@"Tabasko"];
“orderString”之前的所有其他方法都只是单个字符串参数,因此括号在最终结果中没有区别。