Schritt für Schritt - Entwickeln für OS X und iOS
Schritt für Schritt - Entwickeln für OS X und iOS
NSRange, Teil 1

Bei der Arbeit mit Zeichenketten wird NSRange benutzt, um einen bestimmten Bereich innerhalb des Textes zu definieren. NSRange ist eine Struktur mit zwei Feldern, einer Anfangsposition und einer Länge. Nicht zu verwechseln mit einer Anfangs- und einer Endposition.

Nehmen Sie zum Beispiel den folgenden Code. Dort wird eine NSRange, also ein Abschnitt, bestimmt, um einen Teil einer Zeichenketten in einem NSMutableString mit einem anderen Zeichen zu ersetzten.
NSMutableString *textstring = [NSMutableString stringWithCapacity:10];
[textstring setString:
@"Guten Morgen"];
NSRange myRange = NSMakeRange(
2,5);
[textstring replaceCharactersInRange:myRange withString:
@"X"];
NSLog(
@"%@",textstring);
Aus dem Text „Guten Morgen“ wird „GuXorgen“, denn die Zeichen an Position 2 bis 5 werden durch ein X ersetzt. Durch ein X, nicht etwa ein X für jedes ersetzte Zeichen.

Benötigen Sie eine NSRange welche die komplette Länge einer Zeichenkette umfasst, ist diese nicht schwer zu erzeugen, denn Sie können die Länge des Textes ermitteln, indem Sie die Nachricht length an das Objekt senden.
NSRange myRange = NSMakeRange(0,[textstring length]);
Wollen Sie nun sämtliche Vorkommnisse eines Zeichen in einer Zeichenkette ersetzten, geht das so:
NSMutableString *teststring = [NSMutableString stringWithCapacity:10];
[teststring setString:
@"Guten Morgen Entwickler!"];
NSRange myRange = NSMakeRange(
0,[teststring length]);
[teststring replaceOccurrencesOfString:
@"e"withString: @"X"options:
     NSCaseInsensitiveSearch range:myRange];
NSLog(
@"%@",teststring);
Dieser Code ersetzt alle e durch X.

Die Option NSCaseInsensitiveSearch haben Sie schon bei den Vergleichen von NSString kennengelernt, und sie besagt nichts anders, als dass Groß- und Kleinschreibung hier keine Rolle spielt. Wollen Sie aber, dass Großbuchstaben nicht ersetzt werden, verwenden Sie stattdessen NSLiteralSearch. Jetzt bleibt das große E in Entwickler bestehen.
stacks_image_DFAA7460-206E-421F-A363-4FB2F0EFAEF1
Die Methoden replaceCharactersInRange und replaceOccurrencesOfString stehen Ihnen übrigens bei einem regulären NSString nicht zu Verfügung. Die nächste Methode, substringWithRange, funktioniert allerdings auch dort.
NSString *teststring = @"Guten Morgen Entwickler!";
NSRange myRange = NSMakeRange(
2,[teststring length]-4);
teststring = [teststring substringWithRange:myRange];
NSLog(
@"%@",teststring);
Hier werden vom angegebenen Text die ersten und die letzten zwei Zeichen abgeschnitten. Obwohl es auf den ersten Blick etwas irritieren wirkt, müssen Sie tatsächlich die Länge minus 4 rechnen, da Sie schon den Startpunkt um zwei Zeichen verschoben haben. Noch ein Mal zur Erinnerung, die Parameter sind Anfangsposition und Länge!

Besonders sinnvoll wird NSRange immer dann, wenn man den Abschnitt nicht explizit vorgibt, sondern im Programm dynamisch ermittelt. Im folgenden Code geschieht dies für das Wort „morgen“, dessen Position anschließend durch das Wort „Abend“ ersetzt wird.
NSMutableString *textstring =
[NSMutableString stringWithCapacity:
10];
[textstring setString:
@"Guten Morgen Entwickler!"];
NSRange myRange =
[textstring rangeOfString:
@"morgen"options:NSCaseInsensitiveSearch];
[textstring replaceCharactersInRange:myRange withString:
@"Abend"];
NSLog(
@"%@",textstring);