【问题标题】:Why do i get an error comparing NSString's? (-[__NSCFNumber isEqualToString:]: unrecognized selector sent to instance)为什么比较 NSString 时会出错? (-[__NSCFNumber isEqualToString:]: 无法识别的选择器发送到实例)
【发布时间】:2013-01-21 19:22:26
【问题描述】:

我有一个NSMutableArray (_theListOfAllQuestions),我正在用文件中的数字填充它。然后我将该数组中的对象与qNr (NSString) 进行比较,我得到了错误。我什至将数组转换为另一个NSString_checkQuestions,以确保我正在比较NSStrings。我也测试了使用 item 进行比较。

-(void)read_A_Question:(NSString *)qNr {
NSLog(@"read_A_Question: %@", qNr);
int counter = 0;
for (NSString *item in _theListOfAllQuestions) {
    NSLog(@"item: %@", item);
    _checkQuestions = _theListOfAllQuestions[counter]; //_checkQuestion = NSString
    NSLog(@"_checkQuestions: %@", _checkQuestions);
    if ([_checkQuestions isEqualToString:qNr]) {
        NSLog(@">>HIT<<");
        exit(0);   //Just for the testing
    }
    counter++;
 }

运行此代码时,我得到以下NSLog

read_A_Question: 421
item: 1193
_checkQuestions: 1193

...和错误:

-[__NSCFNumber isEqualToString:]:无法识别的选择器发送到实例 0x9246d80 *** 由于未捕获的异常“NSInvalidArgumentException”而终止应用程序,原因:“-[__NSCFNumber isEqualToString:]: 无法识别的选择器发送到实例 0x9246d80'

我确实相信我仍在将 NSString 与某种数字进行比较,但在我看来,我正在比较 NSStringNSString

我真的需要一些帮助来 1) 理解问题,2) 解决问题?

【问题讨论】:

  • 那么_checkQuestions 至少在一种情况下是NSNumber 而不是NSString_theListOfAllQuestions 到底是什么?那是如何填充的?

标签: ios objective-c


【解决方案1】:

替换这一行

if ([_checkQuestions isEqualToString:qNr])

 if ([[NSString stringWithFormat:@"%@",_checkQuestions] isEqualToString:[NSString stringWithFormat:@"%@",qNr]])

希望对你有帮助..

【讨论】:

  • 不需要stringWithFormat,因为NSNumber 已经有一个属性-stringValue 将数字作为字符串返回。
  • @yulz 我不知道 _checkQuestions 的数据类型,使用 stringWithFormat 没有害处..
  • @Praatek,谢谢。
  • 感谢@Prateek :-)
【解决方案2】:

您的 _theListOfAllQuestions 数组包含 NSNumber 对象,而不是 NSString 对象。所以你不能直接使用isEqualToString

试试这个,

for (NSString *item in _theListOfAllQuestions) {
    NSLog(@"item: %@", item);
    _checkQuestions = _theListOfAllQuestions[counter]; //_checkQuestion = NSString
    NSLog(@"_checkQuestions: %@", _checkQuestions);
    if ([[_checkQuestions stringValue] isEqualToString:qNr]) {
        NSLog(@">>HIT<<");
        exit(0);   //Just for the testing
    }
    counter++;
 }

【讨论】:

  • ABC,之前也试过这个,得到“没有可见的@interface for 'NSString' 声明选择器'stringValue'”
  • 那是因为你应该将_checkQuestions 声明为 NSNumber 而不是 NSSString。您的数组有 NSNumbers 而不是字符串。在这种情况下不建议使用[NSString stringWithFormat:@"%@",_checkQuestions]。这将在以后产生意想不到的结果。
  • 将 _checkQuestions 设置为 NSNumber。您可以在 if 语句中输入 [(NSNumber *)_checkQuestions stringValue] 或将声明 _checkQuestions 的类型更改为 NSNumber
  • 我尝试了上述两个建议并且没有错误但也没有 if-hit? ...正如我从 Prateek 那里得到的建议。
  • @ABC,我继续测试,发现我做了一个错字,这意味着你的建议确实有效,我的尴尬错误。你是对的,非常感谢:-) ...现在我学到了一些非常有用的东西! +1
猜你喜欢
  • 2013-01-17
  • 2011-10-16
  • 2011-08-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多