2

我在 NSString 中使用一个 NSMutabledictionary 对象,如下所示:

NSString *state=[d valueForKey:@"State"];

现在有时状态可能为空,有时会填充文本。所以我比较它。虽然比较状态有时变为 NSString,有时变为 NSCFString ..所以无法得到想要的结果..

if([state isEqualToString@""])
{
//do something 
}
else
{
//do something
}

所以在比较时它有时会返回 nil。所以立即跳入 else 块。

我需要一种标准方法来比较状态是否为空是 NSString 还是 NSCFString ...

我该怎么做?

4

3 回答 3

2

如果你不能得到你想要的结果,我可以向你保证,这不是因为你得到的是 aNSCFString而不是 a NSString

在 Objective-C 中,框架充满了集群类;也就是说,你在文档中看到了一个类,而实际上它只是一个接口。相反,框架有自己的这些类的实现。例如,正如您所指出的,NSString该类通常由NSCFString该类表示;还有一些其他的,比如NSConstantStringand NSPathStore2,它们实际上是 , 的子类NSString,它们的行为就像你期望的那样。

你的问题,在我看来...

现在有时状态可能为空,有时会填充文本。

...是在Objective-C中,调用方法是合法的nil。(Nil是 C# 和 Java 等其他语言中的 Objective-C 概念null。)但是,当您这样做时,返回值始终为零;因此,如果您的字符串是nil,则使用方法对其进行的任何相等比较都将返回NO,即使您进行比较也是如此nil。即使这样,请注意空字符串与 不同nil,因为nil可以看作是没有任何东西。一个空字符串没有字符,但是,嘿,至少它在那里。nil意味着什么都没有。

因此,您可能需要使用简单的指针相等来检查is not ,而不是使用方法与state空字符串进行比较。statenil

if(state == nil)
{
    //do something 
}
else
{
    //do something
}
于 2012-12-05T06:12:12.827 回答
1

你可以这样做

if([state isEqualToString:@""])
{
//do something 
}
else
{
//do something
}
于 2012-12-05T06:31:33.747 回答
-1

您必须输入强制转换才能获得正确答案。

 NSString *state = (NSString *) [d valueForKey:@"State"];

  if(state != nil)
  {
      if(state.length > 0)
      {
           //string contains characters
      }
  }
于 2012-12-05T06:09:23.010 回答