Schritt für Schritt - Entwickeln für OS X und iOS
Schritt für Schritt - Entwickeln für OS X und iOS
Lotto mit Dictionary

Statt ein Array zu verwenden, das mühevoll mit einer Schleife durchsucht werden muss, wäre für diese Aufgabenstellung eine Auflistung viel besser geeignet, die man gezielt fragen kann, ob eine Zahl schon vorhanden ist. Ein Dictionary erfüllt genau diese Anforderungen und ermöglicht einen weitaus einfacheren und auch schnelleren Zugriff. An der grundlegenden Funktionsweise der Anwendung ändert sich hingegen nicht viel. Weiterhin muss für jede ausgespielte Zufallszahl geprüft werden, ob sich diese schon in der Auflistung befindet. Allerdings sind dafür viel weniger Anweisungen nötig, wenn man statt eines Array ein Dictionary verwendet.
NSMutableDictionary *zufallsDictonary;
zufallsDictonary = [NSMutableDictionary dictionaryWithCapacity:6];
Der Vergleich funktioniert ähnlich wie bei dem Array, allerdings entfällt die zweite Schleife. Durch objectForKey kann man direkt fragen, ob eine Zahl schon im Dictionary vorhanden ist. Ist das gesuchte Objekt nicht im Dictionary, gibt die Anfrage nil zurück und die neuen Zufallszahl darf hinzugefügt werden.
for (int a = 0; a < 6; a++)
{
    valid = false;

    // Solange Zufallszahlen erzeugen bis eine gültige, noch nicht
    // vorhandene Zahl ermittelt wurde.
    while (valid == false)
    {
        // Neue Zufallszahl erzeugen
        zufallszahl = [[NSNumber alloc] initWithInt:(random() % 49) +1];

        // Prüfen ob diese Zahl schon im Dictionary ist
        if([zufallsDictonary objectForKey:zufallszahl] == nil)
        {
            [zufallsDictonary setObject:zufallszahl forKey:zufallszahl];
            valid = true;
        }
        else
        {
            valid = false;
        }
    }
}
Normalerweise verwendet ein NSMutableDictionary ein Wertepaar aus Key und Object, es spricht aber nichts dagegen, für beide Teile das gleiche Objekt zu verwenden. Im aktuellen Beispiel wird für Key und Objekt die Zufallszahl verwendet.
Leider lassen sich Dictionary nicht sortieren. Möchte man aber trotzdem eine sortierte Ausgabe, lässt sich der Inhalt eines Dictionary leicht in ein Array überführen und dieses kann stattdessen sortiert werden. Die Anweisung allKeys macht aus allen Keys des Dictionary ein Array. Am Ende folgt, wie zuvor auch, die Ausgabe.
// In ein Array übertragen
NSMutableArray *zufallsArray;
zufallsArray = [[
NSMutableArray alloc] init];
[zufallsArray
addObjectsFromArray: [zufallsDictonary allKeys] ];

self.zufall1.stringValue = zufallsArray[0];
self.zufall2.stringValue = zufallsArray[1];
self.zufall3.stringValue = zufallsArray[2];
self.zufall4.stringValue = zufallsArray[3];
self.zufall5.stringValue = zufallsArray[4];
self.zufall6.stringValue = zufallsArray[5];