混乱的方法 - if/then 结构和字符串操作问题

Posted

技术标签:

【中文标题】混乱的方法 - if/then 结构和字符串操作问题【英文标题】:Messed up method - if/then structure and string manipulation problems 【发布时间】:2011-03-19 16:43:06 【问题描述】:

我有一个方法,只要我的视图上的控件发生更改,它就会被调用,并且应该更新UILabel。它有两个UITextFields 和两个UISliders。首先,我检查UITextFields 中的任何一个是否为空,如果是,建议它们需要填写。否则我得到UITextFields' 值之间的差异并生成几个floats在我的NSStrings 中使用。

我收到一条警告说 message 没有被使用,我收到一个关于 NSStrings 的错误(现在不记得具体是什么了 - 我不在我的 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 世界的新手。我可以在条件下使用&lt;&gt; 吗?等于的 == 让我失望 =) 你知道为什么 %d 的东西不起作用吗? 是的,您可以只使用&lt;&gt;。我仍然会将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 结构和字符串操作问题的主要内容,如果未能解决你的问题,请参考以下文章

:测试(if/then)文件测试操作符比较操作符(整数比较字符串比较混合比较)

PL/SQL程序设计

PLSQL——03结构控制

PostgreSQL-PL/pgSQL控制结构

mysql 触发器中的 IF...THEN 语句

构建 PL/SQL IF THEN 语句的更好方法?