混乱的方法 - if/then 结构和字符串操作问题
Posted
技术标签:
【中文标题】混乱的方法 - if/then 结构和字符串操作问题【英文标题】:Messed up method - if/then structure and string manipulation problems 【发布时间】:2011-03-19 16:43:06 【问题描述】:我有一个方法,只要我的视图上的控件发生更改,它就会被调用,并且应该更新UILabel
。它有两个UITextField
s 和两个UISlider
s。首先,我检查UITextField
s 中的任何一个是否为空,如果是,建议它们需要填写。否则我得到UITextField
s' 值之间的差异并生成几个float
s在我的NSString
s 中使用。
我收到一条警告说 message
没有被使用,我收到一个关于 NSString
s 的错误(现在不记得具体是什么了 - 我不在我的 Mac 上...)
即使我将消息简化为简单有效的方法,当delta == 0
时,它也会发送delta <= 0
消息。
哦,字符串不会将值放在 %
符号所在的位置,它们只是打印 %
符号。
我已经破解了太久,需要帮助......
- (void)updateAdvice
if ([chlorineSourceField.text isEqualToString:@""] || [poolVolumeField.text isEqualToString:@""])
NSString *message = [[NSString alloc] initWithString:@"Enter a chlorine source and pool volume."];
else
int delta = [targetLabel.text intValue] - [startingLabel.text intValue];
float chlorineAmount = delta * [poolVolumeField.text intValue] * chlorineConstant;
float percentRemove = (1 - ([targetLabel.text floatValue] / [startingLabel.text floatValue]));
float gallonsRemove = percentRemove * [poolVolumeField.text intValue];
if (delta == 0)
NSString *message = [[NSString alloc] initWithString:@"No adjustments necessary. You're on target"];
if (delta >= 0)
NSString *message = [[NSString alloc] initWithFormat:@"To increase FC by %dppm, add %3.1f oz of %@.", delta, chlorineAmount, chlorineSourceField.text];
if (delta <= 0)
NSString *message = [[NSString alloc] initWithFormat:@"You're above target already. Replace %d%% or %d gallons of water - or just wait for it to come down.", percentRemove*100, gallonsRemove];
adviceLabel.text = message;
[message release];
【问题讨论】:
【参考方案1】:您缺少else
部分,因此所有三个if
语句都被连续评估。如果delta == 0
,它将满足所有三个if
语句。因此,最后一个分配将覆盖前两个。 (而且你会泄漏内存)
此外,您的 message
变量的作用域是它所声明的 if
块的本地变量。您可能希望在函数级别范围内移动 message
声明。
就%
不工作而言,您正在使用实例初始化程序initWithFormat
和类初始化程序stringWithFormat
的语法。 initWithFormat
在单独的参数 - arguments:
中获取格式化字符串的参数。 (顺便说一句,它还需要locale:
)
【讨论】:
呃,我不想小于或等于,只是小于。我是 C 世界的新手。我可以在条件下使用<
和>
吗?等于的 ==
让我失望 =) 你知道为什么 %d 的东西不起作用吗?
是的,您可以只使用<
和>
。我仍然会将else
添加到if
块中 - 您不需要始终评估所有三个。不,我不知道为什么 %d 部分不起作用。
实际上,我只是想通了为什么 %d 不起作用。我会更新我的答案。
我相信 Apple 文档比市面上的任何书籍都更正确。 :-) 但如果它工作得很好,这是你的电话。从您的帖子和您的 cmets 来看,我的印象是它实际上不起作用。
当我说它有效时,我的意思是我的评论中的 sn-p 在书中的示例程序的上下文中有效 - 你是对的,我的代码不起作用。我查看了 Apple 的文档,看看你的意思。他们以我尝试制作琴弦的方式使用stringWithFormat:
。今晚我会在家里试试看。再次感谢耐心的帮助。【参考方案2】:
就message
变量而言,它是有范围的,因此不能在声明它的if
/else
语句之外使用。您想在if
语句之前 声明它,因此您可以在if
语句之外使用它。所以是这样的:
- (void)updateAdvice
NSString *message = nil;
if ([chlorineSourceField.text isEqualToString:@""] || [poolVolumeField.text isEqualToString:@""])
message = [[NSString alloc] initWithString:@"Enter a chlorine source and pool volume."];
else
int delta = [targetLabel.text intValue] - [startingLabel.text intValue];
float chlorineAmount = delta * [poolVolumeField.text intValue] * chlorineConstant;
float percentRemove = (1 - ([targetLabel.text floatValue] / [startingLabel.text floatValue]));
float gallonsRemove = percentRemove * [poolVolumeField.text intValue];
if (delta == 0)
message = [[NSString alloc] initWithString:@"No adjustments necessary. You're on target"];
if (delta >= 0)
message = [[NSString alloc] initWithFormat:@"To increase FC by %dppm, add %3.1f oz of %@.", delta, chlorineAmount, chlorineSourceField.text];
if (delta <= 0)
message = [[NSString alloc] initWithFormat:@"You're above target already. Replace %d%% or %d gallons of water - or just wait for it to come down.", percentRemove*100, gallonsRemove];
adviceLabel.text = message;
[message release];
【讨论】:
谢谢!如果没有帮助,我永远不会想到这一点! +1以上是关于混乱的方法 - if/then 结构和字符串操作问题的主要内容,如果未能解决你的问题,请参考以下文章