2012-06-16 5 views
17

ich ein Objekt aus einer NSObject Klasse, die ich „Marke“ nennen und hat die folgenden Eigenschaften:iOS - ein komplexes Objekt in einem Array zu finden

.name 
.number 
.site 

zu einem bestimmten Zeitpunkt, Dutzende dieser Objekte werden gespeichert auf einem NSMutableArray, so etwas wie:

object 1 
object 2 
object 3 
object 4 
... 

würde Ich mag in der Lage sein ein bestimmtes Objekt aus dem Array durch seine Nummer abzurufen. Nicht der Index des Objekts im Array, sondern die Zahleigenschaft des Objekts (get-Objekt , das beispielsweise die Zahleigenschaft 10 hat).

Ich weiß, dass NSArrays intelligente Methoden zum Abrufen von Zeug haben, aber ich kenne sie nicht tief, weil ich das selten benutze. Gibt es eine Möglichkeit, dieses Objekt aus dem Array abzurufen, ohne alle Objekte im Array durchlaufen zu müssen, und die Nummereigenschaft jedes Objekts zu überprüfen?

Können Sie Jungs helfen? Vielen Dank.

Antwort

15

Ich würde NSPredicate empfehlen. Sie könnten es mit so etwas tun, vorausgesetzt, listOfItems ist Ihr Array mit Ihren NSObject 's mit den genannten Eigenschaften.

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"number == 10"]; 
NSArray *filtered = [listOfItems filteredArrayUsingPredicate:predicate]; 

Ihre gefilterten Ergebnisse, alle Zahlen passende 10 jetzt im filtered Array sein. Wenn Sie zu Ihrem Objekt zurückgeworfen werden möchten, können Sie etwas wie folgt tun:

Ich hoffe, dies hilft.

12
NSUInteger indexOfObject10 = [myArray indexOfObjectPassingTest:^(id obj, NSUInteger idx, BOOL *stop){ 
    MyObject *object = (MyObject *)obj; 
    return [object.number == 10]; 
}]; 

MyObject *object10 = myArray[indexOfObject10]; 
0

Vielleicht so etwas wie folgt aus:

NSObject *retrieveObject = [[NSObject alloc] init]; 
retrieveObject.number = 1; 

NSObject *anObject = [yourMutableArray objectAtIndex:[yourMutableArray indexOfObjectIdenticalTo:testObject]]; 

Zunächst erstelle ich ein Objekt mit der gleichen Anzahl wie ein Objekt in der Anordnung, die ich (in diesem Fall „1“) abrufen möchten. In der nächsten Zeile gehe ich davon aus, dass Sie den Wert eines anderen Objekts zuweisen möchten, indem Sie die Standardmethode objectAtIndex: verwenden, wobei der Indexparameter eine andere Methode ist, nämlich die Methode indexOfObjectIdenticalTo:, wobei der Parameter dieser Methode der Wert ist Objekt. Was das bedeutet, ist, dass es im Array nach dem ersten Objekt aussieht, das mit retrieveObject identisch ist (was bedeutet, dass sie dieselbe Nummer haben), und gibt den Index dieses Objekts zurück und übergibt diesen Wert dann an die Methode objectAtIndex.

Hoffe, das hilft!

1

Ich bevorzuge die Verwendung von Blockerweiterungen für NSArray, mit denen Sie natürlicher sprechen und weniger Code schreiben können. Etwas in den Linien der Sammlungen Smalltalk Jargon:

  • erkennen:
  • auswählen:
  • inject: in:
  • usw.

In Ihrem Fall würde ich verwenden:

MyObject* theObject = [myArray detect:^(MyObject* each){ 
    return each.number == 10; 
}]; 

Hier haben Sie eine mögliche Implementierung für diese Erweiterung zu NSArray

typedef BOOL (^BlockPredicate) (id element); 

-(id) detect:(BlockPredicate) predicateBlock{ 
    for (id each in self) { 
     if (predicateBlock(each)) { 
      return each; 
     } 
    } 
    return nil; 
} 

ich diese Art von Tools finden sehr hilfreich sein. Ich hoffe, Sie finden sie auch nützlich.

+0

Was passiert, wenn das Array mehr als ein Objekt mit der gleichen Nummer enthält? – SpaceDog

+1

Diese Implementierung erkennt und gibt den ersten zurück. Wenn Sie alle Instanzen mit der gleichen Nummer finden möchten, können Sie auswählen:. – Lio

+0

OK. Danke für die Erklärung! – SpaceDog

Verwandte Themen