2011-09-06 11 views

risposta

23

Si potrebbe utilizzare blocchi di enumerazione basato a fare anche questo.

// This will eventually contain the index of the object. 
// Initialize it to NSNotFound so you can check the results after the block has run. 
__block NSInteger foundIndex = NSNotFound; 

[array enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) { 
    if ([obj isKindOfClass:[MyClass class]]) { 
     foundIndex = idx; 
     // stop the enumeration 
     *stop = YES; 
    } 
}]; 

if (foundIndex != NSNotFound) { 
    // You've found the first object of that class in the array 
} 

Se si dispone di più di un oggetto di questo tipo di classe nella propria matrice, si dovrà modificare l'esempio un po ', ma questo dovrebbe darvi un'idea di cosa si può fare.

Un vantaggio di questa enumerazione rapida è che consente anche di restituire l'indice dell'oggetto. Inoltre, se si utilizza enumerateObjectsWithOptions:usingBlock:, è possibile impostare le opzioni per eseguirne la ricerca simultaneamente, in modo da ottenere gratuitamente l'enumerazione con thread o scegliere se cercare la matrice al contrario.

Le API basate su blocco sono più flessibili. Anche se sembrano nuovi e complicati, sono facili da riprendere una volta che inizi ad usarli - e poi inizi a vedere le opportunità per usarli ovunque.

+0

Qual è il vantaggio nell'utilizzo di un metodo basato su blocchi, oltre alla possibilità di specificare una variabile per arrestare l'enumerazione? – futureelite7

+0

Vorrei utilizzare NSNotFound anziché -1. – NSResponder

+0

@NSResponder - Buona cattura - grazie. – Abizern

7

È possibile utilizzare l'enumerazione veloce per scorrere l'array e verificare per la classe:

BOOL containsClass = NO; 

for (id object in array) { 
    if ([object isKindOfClass:[MyClass class]]) { 
     containsClass = YES; 
     break; 
    } 
} 
8

È possibile eseguire questa operazione con un NSPredicate.

NSPredicate *p = [NSPredicate predicateWithFormat:@"self isKindOfClass: %@", 
                 [NSNumber class]]; 
NSArray *filtered = [identifiers filteredArrayUsingPredicate:p]; 
NSAssert(filtered.count == identifiers.count, 
     @"Identifiers can only contain NSNumbers."); 
Problemi correlati