【问题标题】:NSString isEqualToString won't return true, and unrecognized selectorNSString isEqualToString 不会返回 true,并且选择器无法识别
【发布时间】:2013-03-27 00:27:03
【问题描述】:

我有一个字符串 dummyString 需要与 100 进行比较。这是我的代码

  dummyString = [prefs objectForKey:@"displaySize"];
[self setDisplaySize:dummyString];
NSLog(@"Getting ready to set display controller with value %@", dummyString);


NSLog(@"Tried 1");
if ([dummyString isEqual: @"5"]) {
    NSLog(@"Loaded preferences, display Small");
    displayChanged.selectedSegment = 0;}

NSLog(@"Tried 2");
if ([dummyString isEqual: @"40"]){
    NSLog(@"Loaded preferences, display is Med!");
        displayChanged.selectedSegment = 1;}

NSLog(@"Tried 3");
if ([dummyString isEqualToString:@"100"]){
    NSLog(@"Loaded preferences, display LARGE");
    displayChanged.selectedSegment = 2;}

NSLog(@"Completed trying to get display controller with value %@", dummyString);

这是 NSLog

2013-03-26 17:22:49.101 CopyBot[1011:303] Getting ready to set display controller with value 100
 2013-03-26 17:22:49.102 CopyBot[1011:303] Tried 1
 2013-03-26 17:22:49.102 CopyBot[1011:303] Tried 2
 2013-03-26 17:22:49.102 CopyBot[1011:303] Tried 3
 2013-03-26 17:22:49.103 CopyBot[1011:303] -[__NSCFNumber isEqualToString:]: unrecognized selector sent to instance 0x64c7
 2013-03-26 17:22:49.103 CopyBot[1011:303] -[__NSCFNumber isEqualToString:]: unrecognized selector sent to instance 0x64c7

我尝试了几种声明不同字符串的变体,但似乎永远无法让它进入“if”语句以进行任何 isEqual 或 isEqualToString 的比较。任何帮助表示赞赏。

【问题讨论】:

  • [prefs objectForKey:@"displaySize"] 正在返回一个 NSNumber。
  • 你认为他们是如何工作的?每个 if() 语句中的 NSLog 输出永远不会被调用。 @AndrewMadsen
  • 它永远不会被调用,因为调用 isEqualToString: 时会抛出异常。

标签: objective-c xcode macos cocoa nsstring


【解决方案1】:

根据您的错误,您的dummyString 不是NSString 实际上是NSNumber

您可以将字符串@"5" 转换为NSNumber,然后进行比较:

BOOL equal=[dummyString isEqualToNumber:@([@"5" integerValue])];

或者。将 dummystring 值转换为字符串,然后进行比较:

BOOL equal=[NSString stringWithFormat:@"%d",[dummyString integerValue]] isEqualToString:@"5"];

【讨论】:

  • @newtoxcode:正如dummyString 的名字所暗示的那样,字符串是我们大多数人会摸头的地方。但是你有一个名为[dummyString class] 的方法,它将返回它的类类型。只需记录一下,您就可以确定它是字符串还是数组还是数字。
  • 很好的建议。非常感谢。
【解决方案2】:

正如您在错误消息[__NSCFNumber isEqualToString:]: unrecognized selector... 中看到的那样,问题是__NSCFNumber 没有isEqualToString 方法。

__NSCFNumber 是 Cocoa 在运行时代表大多数 NSNumbers 的方式。

所以你的问题是 dummyString 根本不是一个字符串,它是一个NSNumber

【讨论】:

  • @newtoxcode:仅仅因为变量是 NSString 类型并不意味着对象是。 [prefs objectforKey:@"startup"] 显然是一个 NSNumber。
  • @newtoxcode 仅仅因为你将它存储在一个外面写着“字符串”的盒子里,并不意味着它实际上包含一个字符串。 Objective-C 通常非常乐意将值存储在错误类型的变量中。要真正检查您所期望的类型,请使用 isKindOfClass:[dummyString isKindOfClass:[NSString class]] 将返回 false。
  • @newtoxcode 作为一个更简单的例子,NSString * notAString = (id)[NSNumber numberWithInt:4]。编译器非常乐意为您编译它,但是如果您尝试对其执行字符串操作,您的程序将会崩溃。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-01-17
  • 2011-10-16
  • 2011-08-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多