2012-02-21 47 views
0

如何枚舉包含多個類型的對象的NSArray,以獲取找到NSString的所有索引,然後能夠引用每個索引順序說一些像...使用塊枚舉NSArray來查找並存儲數組中的所有NSString的所有索引的

NSString *firstOccurrence = [myArray objectAtIndex:firstOccurrence]; 
NSString *secondOccurrence = [myArray objectAtIndex:secondOccurrence]; 
NSString *thirdOccurrence = [myArray objectAtIndex:thirdOccurrence]; 

謝謝!

編輯:我如何使用的代碼(更新與@NJones例子)

我需要索引的整數值,其中的字符串存儲在陣列中,更新NSUInteger財產「wordDisplayed」與那個價值。

在這裏我的代碼,我使用UIActionSheet的修改版本,接受塊: https://github.com/zoul/Lambda-Alert

NSIndexSet *stringLocations = [arrayInLesson indexesOfObjectsPassingTest:^(id obj, NSUInteger idx, BOOL *stop){ 
    return [(NSObject *)obj isKindOfClass:[NSString class]]; 
}]; 

NSArray *passingObjects = [arrayInLesson objectsAtIndexes:stringLocations]; 

sectionHeadersAct = [[LambdaSheet alloc] initWithTitle:@"Book 2 Lesson 1"]; 
[sectionHeadersAct addButtonWithTitle:@"D. E. F. & G. Teach New Letters" block:^{ 
    //Do nothing yet 
}]; 
[sectionHeadersAct addButtonWithTitle:[passingObjects objectAtIndex:0] block:^{ 
    NSLog(@"First"); 
    wordDisplayed = theIndexOfThisStringIn_arrayInLesson; 
}]; 
[sectionHeadersAct addButtonWithTitle:[passingObjects objectAtIndex:1] block:^{ 
    NSLog(@"Second"); 
    wordDisplayed = theIndexOfThisStringIn_arrayInLesson; 
}]; 
[sectionHeadersAct addButtonWithTitle:[passingObjects objectAtIndex:2] block:^{ 
    NSLog(@"Third"); 
    wordDisplayed = theIndexOfThisStringIn_arrayInLesson; 
}]; 
[sectionHeadersAct addButtonWithTitle:[passingObjects objectAtIndex:3] block:^{ 
    NSLog(@"Fourth"); 
    wordDisplayed = theIndexOfThisStringIn_arrayInLesson; 
}]; 
[sectionHeadersAct setDismissAction:^{ 
    //Do nothing yet 
}]; 
[sectionHeadersAct showInView:self.view]; 
+0

請看看[這裏] [1]。 [1]:http://stackoverflow.com/questions/2802171/string-search-in-string-array-in-objective-c – SteAp 2012-02-21 22:18:30

+0

這並不能幫助我。假設我知道字符串文本是什麼。這些字符串將是動態的,並且數組中不僅有字符串。我認爲可以使用for(id對象在myArray中)類型枚舉來完成我所需要的操作,但對於如何使用塊來完成此操作感到好奇。 – Jason 2012-02-21 22:25:38

回答

5

您可以使用indexesOfObjectsPassingTest:定義的對象的位置獲得NSIndexSet。像這樣:

-(void)findStrings{ 
    NSArray *randomObjects = [NSArray arrayWithObjects:[NSNull null], @"String", [NSNull null], @"String", [NSNull null], nil]; 
    NSIndexSet *stringLocations = [randomObjects indexesOfObjectsPassingTest:^(id obj, NSUInteger idx, BOOL *stop){ 
     return [(NSObject *)obj isKindOfClass:[NSString class]]; 
    }]; 
    NSLog(@"strings %@",stringLocations); 

     // You can get an array of just the passing objects like so: 
    NSArray *passingObjects = [randomObjects objectsAtIndexes:stringLocations]; 
} 
+0

謝謝!比我想出的要好得多! ...見編輯的問題。 :) – Jason 2012-02-21 22:47:45

+0

有沒有辦法引用集合中的每個索引?我需要單獨訪問存儲在集合中的每個索引。我會更好使用數組/ nsnumber包裝? – Jason 2012-02-21 23:08:50

+0

在你的問題中,你正在爲每個變量分配'firstOccurrence'等變量。這是一個情況,你會有固定數量的字符串,或者你只關心第一個這麼多? 'NSIndexSet'在某些情況下是有限的,我只是想弄明白你的確切用法,看它是否合適。 – NJones 2012-02-21 23:24:30

0

嗯,NSArrayenumerateObjectsUsingBlock:方法會讓你列舉使用塊數組中的對象(按你的要求)。

爲了測試字符串,你可以簡單地這樣做:

if ([itemToTest isKindOfClass:[NSString class]]) ... 

而且你可以使用對象鍵和Int值(反之亦然)添加每個那些字典的。