Search code examples
objective-cios5nsstring

How to insert a character into a NSString


How do I insert a space to a NSString.

I need to add a space at index 5 into:

NString * dir = @"abcdefghijklmno";

To get this result:

abcde fghijklmno

with:

NSLOG (@"%@", dir);

Solution

  • You need to use NSMutableString

    NSMutableString *mu = [NSMutableString stringWithString:dir];
    [mu insertString:@" " atIndex:5];
    

    or you could use those method to split your string :

    – substringFromIndex:
    – substringWithRange:
    – substringToIndex:

    and recombine them after with

    – stringByAppendingFormat:
    – stringByAppendingString:
    – stringByPaddingToLength:withString:startingAtIndex:

    But that way is more trouble that it's worth. And since NSString is immutable, you would bet lot of object creation for nothing.


    NSString *s = @"abcdefghijklmnop";
    NSMutableString *mu = [NSMutableString stringWithString:s];
    [mu insertString:@"  ||  " atIndex:5];
    //  This is one option
    s = [mu copy];
    //[(id)s insertString:@"er" atIndex:7]; This will crash your app because s is not mutable
    //  This is an other option
    s = [NSString stringWithString:mu];
    //  The Following code is not good
    s = mu;
    [mu replaceCharactersInRange:NSMakeRange(0, [mu length]) withString:@"Changed string!!!"];
    NSLog(@" s == %@ : while mu == %@ ", s, mu);  
    //  ----> Not good because the output is the following line
    // s == Changed string!!! : while mu == Changed string!!! 
    

    Which can lead to difficult to debug problems. That is the reason why @property for string are usually define as copy so if you get a NSMutableString, by making a copy you are sure it won't change because of some other unexpected code.

    I tend to prefer s = [NSString stringWithString:mu]; because you don't get the confusion of copying a mutable object and having back an immutable one.