为什么我比较NSString时会出现错误?(-[__NSCFNumber isEqualToString:]:向实例发送未识别的选择器)

9

我有一个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中到底有什么?它是如何被填充的? - Alex Wayne
2个回答

15

替换这行代码

if ([_checkQuestions isEqualToString:qNr])

使用

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

希望它能对你有所帮助..


2
不需要使用stringWithFormat,因为NSNumber已经有一个-stringValue属性,该属性将数字作为字符串返回。 - Yuliani Noriega
@yulz 我不知道 _checkQuestions 的数据类型,使用 stringWithFormat 没有任何问题。 - P.J
@Praatek,这样做非常感谢。 - PeterK
感谢 @Prateek :-) - PeterK

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,之前也尝试过这个,并且收到了“NSString没有声明'stringValue'选择器”的错误提示。 - PeterK
这是因为你应该将 _checkQuestions 声明为 NSNumber 而不是 NSSString。你的数组中有 NSNumbers 而不是字符串。在这种情况下,不建议使用 [NSString stringWithFormat:@"%@",_checkQuestions]。那会在后面产生意想不到的结果。 - iDev
1
将_checkQuestions设置为NSNumber。您可以在if语句中强制转换它[(NSNumber *)_checkQuestions stringValue],或者在声明_checkQuestions为NSNumber的位置更改其类型。 - Yuliani Noriega
我尝试了上述两个建议,没有错误,但也没有像Prateek的建议那样有if-hit。 - PeterK
@PeterK,你可以自己决定是按照正确的方式还是以后可能会破坏你的代码的方式来完成它。使用[NSString stringWithFormat:有不同的目的。苹果为这种类型的转换添加了NSNumber类中的stringValue,这是有原因的。 - iDev
1
@ABC,我继续测试并发现了一个打字错误,这意味着你的建议确实起作用了,我的错误令人尴尬。你是正确的,非常感谢 :-) ...现在我学到了非常有用的东西!+1 - PeterK

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接