Programmieren mit Swift - Für macOS und iOS
Programmieren mit Swift - Für macOS und iOS
Arrays aus eigenen Klassen

Ein Array lässt sich natürlich nicht nur mit Objekten der von Apple zur Verfügung gestellten Klassen füllen, auch Objekte aus selbst programmierten Klassen sind in einer solchen Auflistung möglich. Gegeben sei die schon aus anderen Lektionen bekannte Klasse Person, von der im folgenden Beispiel zwei Instanzen erzeugt und mit Werten gefüllt werden. Einmal in der klassischen Objective-C Schreibweise mit eckigen Klammern und für das zweite Objekt mit Hilfe der Punktnotation. Außerdem wird dort alloc und init mit new abgekürzt. Außer in den Daten der Person gibt es aber keinen Unterschied zwischen den beiden Objekten.
// Klassische Schreibweise
Person *myPerson1 = [[Person alloc] init];
[myPerson1
setName:@"Huber"];
[myPerson1
setVorname:@"Hans"];
[myPerson1
setAlter:32];

// Mit Punktnotation
Person *myPerson2 = [Person new];
myPerson2.n
ame = @"Adrian";
myPerson2.v
orname = @"Fischer";
myPerson2.a
lter = 55;

NSArray *personArray;
personArray = [
NSArray arrayWithObjects:myPerson1,myPerson2,nil];
Zwar wurde zu Anfang der Lektion behauptet, Arrays könnten keinen einfachen Datentypen aufnehmen, doch gilt das nicht für Objekte, die einfache Datentypen enthalten. Diese können problemlos in einem Array gespeichert werden. Die Instanzen der Klasse Person verwaltet das Alter als int, aber das Array verwaltet nur die Speicheradresse des gesamten Objektes, unabhängig aus welchen Typen es besteht. So können mit Hilfe einer Klasse auch primitive Datentypen in einem NSArray abgelegt werden. Mehr dazu am Ende der Lektion.

Mit den beschriebenen Anweisungen werden zwei Person-Objekte im Array gespeichert und es bleibt die Frage, wie man sie wieder heraus bekommt. Da ein Objekt von Person mehrere Eigenschaften enthält, ist etwas mehr Aufwand nötig, um auf die einzelnen Felder zuzugreifen. Das ganze Objekt direkt auf der Konsole auszugeben ist nicht ohne weiteres möglich und auch selten erforderlich.
for(int i = 0; i < [personArray count]; i++)
{
Person *aPerson = [personArray objectAtIndex:i];
    NSLog(@"%@",[aPerson name]);
    NSLog(@"%@",[aPerson vorname]);
   
NSLog(@"%i",[aPerson alter]);
}
Da das Array nur Speicherzeiger verwaltet, ist es nicht weiter schwer, diesen Zeiger einer weiteren Person-Variablen zuzuweisen. Wie man gut sieht, wird nicht mit alloc und init gearbeitet, da kein neues Objekt erzeugt werden soll. Der Bezeichner aPerson erhält nur einen Verweis auf ein schon im Speicher existierendes Objekt.
Möchte man ein wenig Programmierarbeit sparen, kann man die Anweisungen auch zusammenfassen, indem man eingebettete und verschachtelte Methoden (nested methods) verwendet. Dann erübrigt sich die Deklaration der Variablen, die anderen Anweisungen werden aber etwas länger.
for(int i = 0; i < [personArray count]; i++)
{
    NSLog(@"%@",[[personArray objectAtIndex:i] name] );
    NSLog(@"%@",[[personArray objectAtIndex:i] vorname]);
    NSLog(@"%i",[[personArray objectAtIndex:i] alter]);
}