-[__NSCFNumber objectForKeyedSubscript:]: 无法识别的选择器发送到实例

-[__NSCFNumber objectForKeyedSubscript:]: unrecognized selector sent to instance

所以我已经坚持了一段时间了,我已经浏览了 Whosebug 上的许多帖子,但我似乎仍然无法弄清楚如何解决这个问题。在我看来,"dict" 应该被转换成一个字符串,所以我尝试了很多方法,比如使用 NSString *myString = [NSNumber stringValue];[NSString stringWithFormat:@"%d", dict[@"id"]]; 和其他一些方法。这是代码:

for (NSDictionary *dict in self.params) {
    NSString *value = dict[@"id"];

    if (value) {
        [parameters appendFormat:@"&ids[]=%@", value];
    }
}

我得到的错误是在这一行:NSString *value = dict[@"id"];

控制台输出显示:

*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[__NSCFNumber objectForKeyedSubscript:]: unrecognized selector sent to instance 0xb00000000000a313'

我认为问题在于它似乎没有正确转换为字符串。该行将 dict 显示为 NSCFNumber (long)2609。如何将其转换为字符串?

您的 self.params 数据必须包含一个 NSNumber。一旦你找到号码并尝试获取密钥,你就会崩溃。

您需要清理数据,或者编写代码来检查数组中每个对象的 class,然后再尝试从中获取键值。

您可以像这样修改循环:

for (NSDictionary *dict in self.params) 
{
    if (![dict isKindOfClass: [NSDictionary class])
    { 
      NSLog("Non-Dictionary object %@ found. Skipping.", dict)
      continue;
    }
    NSString *value = dict[@"id"];

    if (value) {
        [parameters appendFormat:@"&ids[]=%@", value];
    }
}

// 像这样尝试它会起作用

for (NSDictionary *dict in self.params) {
if([dict isKindOfClass:[NSDictionary class]]) {
  NSString *value = [NSString stringWithFormat:@"%@",dict[@"id"]];

  if (value) {
      [parameters appendFormat:@"&ids[]=%@", value];
  }
}
}
  [self.params enumerateObjectsUsingBlock:^(id  _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {
     if ([obj isKindOfClass:[NSDictionary class]]) {

    // Do whatever you want
    }
}];