向现有字符串追加字符 Objective-C

4

我正在尝试在程序中动态追加和修改NSString字符串。我想知道以下几点:

  • 如何修改定义的NSString字符串中的特定字符?
  • 如何在定义的NSString字符串中添加字符?

例如,如果我定义了以下内容:NSString *word = [[NSString alloc] initWithString:@"Hello"];我该如何将字母"e"替换为"a",并且如何向该字符串本身添加另一个字符?

4个回答

7
不要使用NSString进行字符串操作,应该使用NSMutableStringNSMutableStringNSString的子类,专门用于此目的。
来自苹果文档: NSString类声明了一个程序化接口,用于管理不可变字符串。 (不可变字符串是创建时定义的文本字符串,之后不能更改。 NSString被实现为表示一个Unicode字符数组的字符串) NSString的可变子类是NSMutableString
NSMutableString *word = [[NSMutableString alloc] initWithString:@"Hello"];
//Replace a character 
NSString*  word2 = [word stringByReplacingOccurrencesOfString:@"e" withString:@"a"];

[word release];
word = nil ;

word = [[NSMutableString alloc] initWithString:word2 ];
//Append a Character
[word appendString:@"a"];

有更多的字符串操作函数,请查看苹果文档NSMutableString

编辑:

你可以首先使用rangeOfString来获取字符串的范围(在这里是@"e")。

- (NSRange)rangeOfString:(NSString *)aString options:(NSStringCompareOptions)mask

首先检查NSRange对象是否有效,然后在您的NSMutableString上使用replaceCharactersInRange函数替换一组字符为您的字符串。

- (void)replaceCharactersInRange:(NSRange)aRange withString:(NSString *)aString

1
你实际上并没有修改NSMutableString,我认为你的示例中存在内存泄漏。尽管word最初是NSMutableString的一个实例,但stringByReplacingOccurrencesOfString:withString是NSString超类上的一个方法,它创建并返回一个新的自动释放的不可变NSString实例。 - Bryan Irace
我认为这里的问题是,如果您的字符串中有两个相同的字母,例如“hello”中的“l”,如果您只想替换其中一个“l”,那么就会遇到问题。 - locoboy
总体来说是个不错的答案,但是作为一个小问题,你的示例中并不需要使用NSMutableString,因为你从未修改任何字符串变量。replaceOccurances:~stringByAppending~:等方法会生成新的NSStrings——不需要进行任何改变! :) (啊,我看到你在最后使用了appendString:示例,所以需要一个可变的字符串。) - Olie

5

NSString实例是不可变的。您可以通过像这样在另一个字符串中添加或替换字符来创建新的NSString实例:

NSString *foo = @"Foo";
NSString *bar = @"Bar";

NSString *foobar = [foo stringByAppendingString:bar];
NSString *baz = [bar stringByReplacingOccurrencesOfString:@"r" withString:@"z"];

如果你确实需要直接修改一个实例,可以使用NSMutableString代替NSString。

如果你真的想使用原始字符,NSString有几个初始化器可以接受字符数组(例如initWithCharacters:length:)。


谢谢您的帮助,您能将UILabel连接到NSMutableString吗?另外,您替换方法的问题在于像“Hello”这样的单词有重复的字符(“Hello”中的“l”就是一个例子)。如果您使用您的方法,您将不得不替换每个“l”。 - locoboy
看起来不是这样。虽然有点丑,但我认为你需要做类似于 [label setText:[[label text] stringByAppendingString:@"newSuffix"]]; 这样的事情。 - Bryan Irace
回答你有关替换重复字母的问题,你可以使用 stringByReplacingCharactersInRange:withString: 更具体地说明你要用什么替换什么。 - Bryan Irace

2

首先:

如果您要修改字符串,必须使用NSMutableString。NSStrings无法修改,因此它们有一个可修改的伴侣。

然后,NSMutableString有两种方法对您很有帮助:

replaceCharactersInRange:withString deleteCharactersInRange:

(抱歉没有直接链接到这些方法的链接。StackOverflow总是对我作为新用户施加限制...)。


2

补充一下,NSMutableString有一个叫做appendFormat的方法,在添加内容时非常有用:

[str appendFormat:@"%@-%@-%@", @"1", @"2",@"3"]

将"1-2-3"追加到str中。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接