NSString
с неизменяемы; mutableCopyWithZone:
даст вам ( неявно удерживается ) NSMutableString
. Однако NSMutableString
не имеет способа установки отдельных символов. Было бы проще получить массив символов, используя один из множества методов (например, getCharacters:range:
для широких символов или cStringUsingEncoding:
, getCString:maxLength:encoding:
или UTF8String
для строк в стиле c), затем оперируйте этим (обратите внимание, некоторые методы возвращают строки const), затем создайте новую строку, используя (например) initWithCString:encoding:
. Помните, что в зависимости от того, что вы пытаетесь выполнить , смещение байтов может не дать ожидаемого результата из-за проблем с кодированием и многобайтовых символов.
Вы можете получить длину строки, используя length
, который представляет собой количество символов в строке (также размер в unichars буфера для хранения данных UTF-16, а не включая нулевой терминатор), или lengthOfBytesUsingEncoding:
, который сообщит вам размер (количество байтов), необходимый для буфера для хранения содержимого строки (не включая нулевой терминатор). maximumLengthOfBytesUsingEncoding:
также может использоваться для размера буфера, хотя он может быть больше, чем фактический необходимый размер. Для кодировок переменной длины максимальный размер - это максимально возможный размер символов (например, 3 для кодированных в UTF-8 Unichars), умноженный на количество символов.
Циклы и смещения в остальном такие же, как в C: инициализируйте индексную переменную с нижней границей (0) и зацикливайте, пока индексная переменная не превысит верхнюю границу.
NSUInteger i;
NSString *result=nil;
unichar *data;
NSRange dataRange = {0,0};
dataRange.length = [string length];
if ((data = malloc(dataRange.length * sizeof(unichar)))) {
[string getCharacters:data range:dataRange];
for (i=0; i < dataRange.length; ++i) {
// shiftAmount is declared elsewhere
data[i] <<= shiftAmount;
}
result = [[NSString alloc] initWithCharacters:data length:dataRange.length];
} else {
// malloc() failed; handle error
...
}
Если данные не строковые данные, а байты, то более подходящим будет NSData
/ NSMutableData
.