NSMutableArray中的indexOfObject返回垃圾值

时间:2013-06-05 11:24:15

标签: iphone ios

尝试在NSMutableArray中获取对象的索引。它返回一些垃圾值,而不是为什么它没有返回特定项的索引。下面是我试过的代码。

NSString *type = [dictRow valueForKey:@"type"];

if([arrSeatSel indexOfObject:type])
{
    NSUInteger ind = [arrSeatSel indexOfObject:type];
    [arrTotRows addObject:[arrSeatSel objectAtIndex:ind]];
}

类型包含值“Gold”。并且arrSeatSel包含

 (
"Gold:0",
"Silver:0",
"Bronze:1"

如何检查。请指导。

4 个答案:

答案 0 :(得分:7)

您获得的价值是NSNotFound。您收到NSNotFound因为@"Gold"不等于@"Gold:0"

您应该尝试以下

NSUInteger index = [arrSeatSel indexOfObjectPassingTest:^BOOL(id obj, NSUInteger idx, BOOL *stop){
    return [obj hasPrefix:type];
}];

if (index != NSNotFound) {
    [arrTotRows addObject:[arrSeatSel objectAtIndex:index]];
}

<强>更新

-indexOfObjectPassingTest:运行以下循环。注意:/* TEST */是一些在找到正确索引时返回true的代码。

NSUInteger index = NSNotFound;
for (NSUInteger i = 0; i < [array count]; ++i) {
   if (/* TEST */) {
       index = i;
       break;
   }
}

在我的第一个示例中,/* TEST */[obj hasPrefix:type]。最后的for循环看起来像。

NSUInteger index = NSNotFound;
for (NSUInteger i = 0; i < [arrSeatSel count]; ++i) {
   if ([arrSeatSel[i] hasPrefix:type]) {
       index = i;
       break;
   }
}

if (index != NSNotFound) {
    [arrTotRows addObject:[arrSeatSel objectAtIndex:index]];
}

我更喜欢-indexOfObjectPassingTest:

[obj hasPrefix:type]部分只是比较字符串的另一种方式。有关详细信息,请阅读-hasPrefix:文档。

希望能回答你的所有问题。

答案 1 :(得分:2)

有时正确存储数据可以解决很多问题。如果我猜对了

"Gold:0"表示Gold类型的圆圈,其计数为0.

您可以尝试将其重新格式化为一系列项目。

[
    {
        "Type": "Gold",
        "Count": 0
    },
    {
        "Type": "Silver",
        "Count": 0
    },
    {
        "Type": "Bronze",
        "Count": 1
    }
]

然后使用谓词来查找索引

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"Type == %@",@"Gold"];
NSUInteger index = [types indexOfObjectPassingTest:^BOOL(id obj, NSUInteger idx, BOOL *stop) {
    [predicate evaluateWithObject:obj];
}];

答案 2 :(得分:1)

您可以尝试这样做。

[arrSeatSel enumerateObjectsUsingBlock:^(id object, NSUInteger idx, BOOL *stop) {

    // object - will be your "type"
    // idx - will be the index of your type.
}];

希望这会有所帮助。

答案 3 :(得分:1)

如果我正确阅读,您说arrSeatSel包含三个NSString@"Gold:0"@"Silver:0"@"Bronze:1", ?

然后您的NSString* type基本上是@"Gold"

第一件事是Gold,而Gold:0是不同的字符串,而这只是初学者。

当您在数组中搜索字符串时,您应该取出每个字符串,并进行字符串匹配,而不仅仅是比较。我所说的是:

NSString* str1 = @"This is a string";
NSString* str2 = @"This is a string";
if ( str1 == str 2 ) NSLog(@"Miracle does happen!")

条件永远不会成立,即使两个NSString包含相同的值,它们是不同的对象,因此是指向不同内存块的不同指针。

这里你应该做的是字符串匹配,我会在这里推荐NSString的{​​{1}}方法,因为它似乎符合你的需要。