我正在学习Objective C和iOS开发。我正在尝试重新创建我们在Java类中完成的一些项目(我知道它们完全不同)但我在其中一个项目中遇到了麻烦。我们有一天在实验室里做凯撒转变。字符串操作实验室。这是Java中一个非常基本的交易... for循环字符串并更改每个字符。我似乎找不到任何方法来改变Objective C中的单个字符。我查看了NSMutableString文档和NSString文档,我知道我可以做一个
[NSString stringByReplacingCharactersInRange:(NSRange *) withString:(NSString *)
但这并没有真正帮助,因为我不知道我将要取代什么。我需要找到一种方法来获取特定索引处的字符并进行更改。有什么想法吗?
答案 0 :(得分:2)
听起来您正在寻找[NSString characterAtIndex:(NSUInteger)]
方法
E.g。
NSString *string = @"abcde";
NSString *character = [NSString stringWithFormat:@"%C",[string characterAtIndex: 0]];
NSLog(@"%@", character);
结果:a
使用它和NSMutableString
,您可以构建所需的字符串。
使用appendString
您可以添加到NSMutableString
答案 1 :(得分:1)
执行此操作的最佳方法可能是使用一个好的旧C字符串,因为它允许您更改字节而不会每次重新分配不同的字符串的开销:
NSString *ceasarShift(NSString *input)
{
char *UTF8Str = strdup([input UTF8String]);
int length = [input length];
for (int i = 0; i < length; i++)
{
UTF8Str[i] = changeValueOf(UTF8Str[i]); // some code here to change the value
}
NSString *result = [NSString stringWithUTF8String:UTF8Str];
free(UTF8Str);
return result;
}
这减少了开销,虽然您必须释放完成后分配的数据,但它为您提供了不依赖高级API的优势,从而大大提高了性能。 (数组和动态方法查找之间的差异是大约5个CPU周期,如果您正在进行任何主要的加密,这意味着很多)
也许还会考虑NSMutableData
这类任务,而不是NSString
,因为随机\0
可能会偶然出现在结果字符串中。