我有NSMutableArray,其中包含NSArray和String:
NSMutableArray *alphabets = [[NSMutableArray alloc] init];
[alphabets addObject:[NSArray arrayWithObjects:@"ㄱ",@"ㄲ", nil]];
[alphabets addObject:@"ㄴ"];
[alphabets addObject:[NSArray arrayWithObjects:@"ㄷ",@"ㄸ", nil]];
[alphabets addObject:@"ㄹ"];
[alphabets addObject:@"ㅁ"];
[alphabets addObject:[NSArray arrayWithObjects:@"ㅂ",@"ㅃ", nil]];
[alphabets addObject:[NSArray arrayWithObjects:@"ㅅ",@"ㅆ", nil]];
[alphabets addObject:@"ㅇ"];
[alphabets addObject:[NSArray arrayWithObjects:@"ㅈ",@"ㅉ", nil]];
[alphabets addObject:@"ㅊ"];
[alphabets addObject:@"ㅋ"];
[alphabets addObject:@"ㅌ"];
[alphabets addObject:@"ㅍ"];
[alphabets addObject:@"ㅎ"];
我想检查索引的对象数是否大于1然后我可以知道我的字母表包含具有多个值的数组。这是代码:
for (int i = 0 ; i < [alphabets count]; i++){
if([[alphabets objectAtIndex:i] count] > 1){
NSLog(@"multiple values");
}else{
NSLog(@"%@", [alphabets objectAtIndex:i]);
}
}
但代码总是会出错。
这是错误: 无法识别的选择器发送到实例0x2d550
如何按索引计算对象? 请帮我解决一下。
感谢
答案 0 :(得分:2)
您无法将邮件count
发送至NSString
。由于您的数组中混合了NSString
和NSArray
个对象,因此您需要添加一项检查,以确定您仅向count
发送NSArray
,而不是NSString
S:
for (int i = 0 ; i < [alphabets count]; i++){
if([[alphabets objectAtIndex:i] isKindOfClass:[NSArray class]] && [alphabets objectAtIndex:i].count > 1){
NSLog(@"multiple values");
}else{
NSLog(@"%@", [alphabets objectAtIndex:i]);
}
}
答案 1 :(得分:2)
这是一种使用快速枚举的方法:
for (NSObject *object in alphabets) {
if ([object respondsToSelector:@selector(count)]) {
// It's probably an array
NSArray *array = (NSArray *)object;
NSLog(@"multiple values in array with count %d", array.count);
} else {
NSLog(@"%@", object);
}
}
这样可以防止将count
发送到错误的对象。
提醒一句:respondsToSelector:
只检查一个选择器和其他对象可能响应count
但不是数组。 (NSDictionary就是一个例子。)在这种情况下,您可以使用其他类似的测试,例如isKindOfClass:
。
答案 2 :(得分:1)
如果您只想检查对象是否为数组,请使用
if([something isKindOfClass:[NSArray class]]){
NSLog(@"It's an array");
}
答案 3 :(得分:0)
您的NSMutableArray包含两种不同的对象:NSString对象和NSArray对象。因此,使用来自此数组的对象的每个人都必须检查他们获得的对象是NSString还是NSArray。
如果您只使用一个NSString添加NSArray对象而不是添加普通的NSString对象,那么对于其余代码可能会更容易。