【问题标题】:Issue while comparing two strings which are nil - Objective C比较两个为零的字符串时出现问题-Objective C
【发布时间】:2016-12-20 19:36:38
【问题描述】:

我正在比较两个字符串。

问题是我的两个字符串都是nil。我不知道两个字符串什么时候出现nil,那么为什么控制进入success 块。

我正在使用这段代码来比较字符串:

  if(![oldString isEqualToString:newString]) 
        {
            //in case both are nil control reaches here
            needToShowPopup = YES;
            break;
        }

编辑:我希望如果只有两个字符串不同,那么只有我的控件会进入if statement。当两者都是nil时,我的条件失败了

【问题讨论】:

  • 有4种可能。 1) 两个字符串都不是 nil,2) 两个都是 nil,3) 只有 oldStringnil,4) 只有 newStringnil。用您希望如何处理所有 4 个案例来更新您的问题。
  • 您的编辑没有帮助。清楚地解释您希望如何处理所有 4 种情况。只是说您希望“处理”它并没有告诉我们如何处理。
  • @rmaddy 现在好吗?
  • 请注意,当oldStringnil 时,对isEqualToString 的调用将始终返回0。实际上,在nil 对象上调用的每个方法都保证返回0。跨度>
  • 您被否决了,因为您需要 30 秒才能通过调整和运行代码来查看当字符串为空时 [oldstring isEqualToStringLnewString] 评估的内容。然后你会看到它评估为假。那么你应该知道 !false 是真的。因此,只需几分钟的调试工作,一开始就不需要提问。

标签: objective-c null nsstring


【解决方案1】:

如果您希望仅在两个字符串都不是 nil 时评估 if 条件,那么您可以这样做:

if (oldString && newString && ![oldString isEqualToString:newString]) {
    // both strings are set but they are not the same
}

如果oldStringnil,无论newString 的值如何,您拥有的代码都将进入if 语句。

【讨论】:

  • 在此澄清(从上面的评论中引入,以便@RahulMishra 看到它):发送到nil 的任何消息总是返回0 或其等效项(0.0nilNO 等)。当你问[oldString isEqualToString:...]时,第二个参数是什么并不重要;这将始终返回NO。这会导致一些违反直觉的事情,例如 [nil isEqual:nil] == NO
【解决方案2】:

认为你说你想要[nil isEqualToString:nil] 的等价物返回真。如果是这种情况,您的if 可以写成:

if(oldString ? ![oldString isEqualToString:newString] : newString)

或者,如果您不希望 if 在其中一个或两个值为 nil 时执行,则可以编写您的 if

if(oldString && newString && ![oldString isEqualToString:newString])

HTH

【讨论】:

  • 在第一个选项中,不应该是!newString来正确检测到两个字符串都是nil吗?
  • @AurelienPorte - OP 希望 if 的主体评估两个字符串是否不同。 OP 的原始代码在 nil/nil 中失败,因为子表达式 [nil isEqualToString:nil] 的计算结果为 false,因此复杂的表达式 ![nil isEqualToString:nil] 的计算结果为 true,在这种情况下 OP 想要 false。第一个选项确实会为 nil/nil 生成 false。
【解决方案3】:

我是这样做的

if(oldString == newString || [oldString isEqualToString:newString]) {
   // strings are the same
}

第一次检查oldString == newString 比较指针。要么两个指针都是同一个内存地址,所以它们在定义上必须相等,或者两个指针都是nil,所以也相等

如果失败,那么我们调用[oldString isEqualToString:newString],它比较字符串内容。如果任何一方都是 nil,那么这将返回我们想要的 false,但如果双方都是 nil,它将在之前的检查中捕获它,我们不会到达这里:-)

【讨论】:

    【解决方案4】:
    If (oldstring!=null)
    {
    Your code...
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-10-29
      • 1970-01-01
      • 2017-09-18
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多