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

时间:2016-05-10 11:11:17

标签: ios objective-c unrecognized-selector

所以我现在已经坚持了一段时间,我已经浏览了Stackoverflow上的很多帖子,但我似乎还无法弄清楚如何解决这个问题。在我看来," 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(长)2609。如何将其转换为字符串?

3 个答案:

答案 0 :(得分:2)

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

在尝试从中获取键值之前,您需要清理数据或编写检查数组中每个对象的类的代码。

您可以像这样修改循环:

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];
    }
}

答案 1 :(得分:1)

//试试这样它会起作用

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

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

答案 2 :(得分:0)

  [self.params enumerateObjectsUsingBlock:^(id  _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {
     if ([obj isKindOfClass:[NSDictionary class]]) {

    // Do whatever you want
    }
}];