Создание и конвертация строковых объектов.

Cocoa

NSString и его подкласс NSMutableString обеспечивают несколько способов создания строковых объектов, большинство из них основаны на поддержке различных кодировок. Хотя строковые объекты всегда содержат строки, как Unicode символы, они могут конвертировать свое содержимое и во многих других кодировках, например, 7-битные ASCII, ISO Latin 1, EUC, и Shift-JIS. Метод класса availableStringEncodings возвращает какие кодировки поддерживаются. Вы можете указать кодировку явно при преобразовании строки C или из строкового объекта, или использовать строку C с кодировкой по умолчанию, которая варьируется от платформы к платформе и возвращается методом класса defaultCStringEncoding.

Создание строк

Простейший способ создать строку объекта в исходном коде -использовать конструкцию Objective-C: @".....":

NSString *temp = @"/tmp/scratch";

Заметим, что при создании строковой константы таким образом, не следует использовать ничего, кроме 7-битных ASCII символов. Такой объект создается во время компиляции и существует на протяжении выполнения вашей программы. Компилятор делает такие константы объекта уникальным для каждого модуля, и они никогда не освобождаются, хотя вы можете сохранить и освободить их, как и любой другой объект. Вы также можете отправлять сообщения непосредственно в строковую константу, как и в любую другую строку:

BOOL same = [@"comparison" isEqualToString:myString];

NSString из С строки и данных

Чтобы создать объект NSString из строки C, можно использовать такие методы, как initWithCString:encoding:. Очень важно правильно указать кодировку строки C. Подобные методы позволяют создавать строковые объекты из символов в различных кодировках. Метод initWithData:encoding: позволяет конвертировать строку данных, хранящихся в объекте NSData в объект NSString.

char *utf8String = /* assume this exists */ ;

NSString *stringFromUTFString = [[NSString alloc] initWithUTF8String:utf8String];

char *macOSRomanEncodedString = /* принимает существующую строку */ ;

NSString *stringFromMORString =

            [[NSString alloc] initWithCString:macOSRomanEncodedString

                              encoding:NSMacOSRomanStringEncoding];

NSData *shiftJISData =  /* принимает существующую строку */ ;

NSString *stringFromShiftJISData =

            [[NSString alloc] initWithData:shiftJISData

                              encoding:NSShiftJISStringEncoding];

Следующий пример преобразует объект NSString содержащие UTF-8 в данные из символы ASCII затем обратно в объект NSString.

unichar ellipsis = 0x2026;

NSString *theString = 
   [NSString stringWithFormat:@"To be continued%C", ellipsis];

NSData *asciiData = [theString dataUsingEncoding:NSASCIIStringEncoding
   allowLossyConversion:YES];

NSString *asciiString = [[NSString alloc] initWithData:asciiData
   encoding:NSASCIIStringEncoding];

NSLog(@"Original: %@ (length %d)", theString, [theString length]);

NSLog(@"Converted: %@ (length %d)", asciiString, [asciiString length]);

// output:

// Original: To be continued… (length 16)

// Converted: To be continued... (length 18)

Важно: NSString предоставляет ряд методов для использования непосредственно строк C (например, stringWithCString:,initWithCString:, initWithCString:length:, и initWithCStringNoCopy:length:freeWhenDone:). Эти методы используют строку C с кодировкой по умолчанию и могут привести к потере информации в процессе кодирования. Вам настоятельно не рекомендуется использовать эти методы так, как они являются устаревшими в Mac OS X v10.4.

Переменные строки

Для создания переменной строки, вы обычно используете stringWithFormat: или initWithFormat: (или локализованных строк, localizedStringWithFormat:). Эти методы и их отпрыски используют строку формата в качестве шаблона, в который вы предоставляете значения (строки и другие объекты, числовые значения, и так далее) которые в нее вставляются. Они и поддерживают спецификаторы формата описанные в разделе "Форматирование строковых объектов".

Вы можете создать строку из существующих строковых объектов, используя методы stringByAppendingString: и stringByAppendingFormat:, создающих новую строку, добавив одну строку за другой или во втором случае с помощью строки формата.

NSString *hString = @"Hello";

NSString *hwString = [hString stringByAppendingString:@", world!"];

Строки, которые будут представлять пользователю

При создании строки для представления пользователю, вы должны рассмотреть важность локализации вашего приложения. В общем, следует избегать создания видимых пользователю строк непосредственно в коде. Вместо этого вы должны использовать строки в коде, как ключ к словарю локализации, который будет поставлять видимые пользователю строки на предпочитаемом языке. Как правило, это связано с использованием NSLocalizedString и подобных макросов, как показано в следующем примере.

NSString *greeting = NSLocalizedStringFromTable

    (@"Hello", @"greeting to present in first launch panel", @"greetings");

Объединение и извлечение строк

Вы можете по-разному комбинировать и извлекать строки. Самый простой способ для объединения двух строк это добавить одну к другой. Метод stringByAppendingString: возвращает строковый объект сформированый из объекта приемника и заданного аргумента.

NSString *beginning = @"beginning";

NSString *alphaAndOmega = [beginning stringByAppendingString:@" and end"];

// alphaAndOmega содержит новую строку: @"beginning and end"

Вы также можете объединить несколько строк в соответствии с шаблоном при помощи методов initWithFormat:, stringWithFormat: и stringByAppendingFormat:, они описаны более подробно в "Форматирование строковых объектов".

Вы можете извлекать подстроки с начала или с конца строки в пределах индекса, или из определенного диапазона, с помощью методов: substringToIndex:, substringFromIndex: и substringWithRange:. Можно также разделить строку на подстроки (основано на разделителе строки) методом componentsSeparatedByString: . Эти методы проиллюстрированы на следующих примерах, обратите внимание, что индекс в методах основанных на индексе, начинается с 0:

NSString *source = @"0123456789";

NSString *firstFour = [source substringToIndex:4];

// firstFour содержит: @"0123"

NSString *allButFirstThree = [source substringFromIndex:3];

// allButFirstThree содержит: @"3456789"

NSRange twoToSixRange = NSMakeRange(2, 4);

NSString *twoToSix = [source substringWithRange:twoToSixRange];

// twoToSix содержит: @"2345"

NSArray *split = [source componentsSeparatedByString:@"45"];

// массив split содержит: { @"0123", @"6789" }

Если вам нужно извлечь строки, используя сопоставление с образцом, а не по индексу, вы должны использовать сканер, см. "Сканеры".

Получение C Строки

Чтобы получить С строку от строкового объекта, рекомендуется использовать UTF8String. Это возвращает const char *, используя кодировку строки UTF8.

const char *cString = [@"Hello, world" UTF8String];

Полученная Вами строка C принадлежит временному объекту, и станет недействительной, если произойдет автоматическое освобождение. Если вы хотите получить постоянную строку C, необходимо создать буфер и скопировать содержимое const char *, возвращенную методом.

Подобные методы позволяют создавать строковые объекты из символов в кодировке Юникод или произвольной кодировке, а также для извлечения данных в этих кодировках. initWithData:encoding:, и dataUsingEncoding: выполняют эти преобразования из и в NSData объекты.

Важно: NSString предоставляет ряд методов для использования C строки непосредственно (например, cString, cStringLength, lossyCString, getCString:, getCString:maxLength:, getCString:maxLength:range:remainingRange:). Эти методы используют строку C с кодировкой по умолчанию и могут привести к потере информации в процессе преобразования в или из этой кодировки. Вам настоятельно рекомендуется не использовать эти методы, поскольку они являются устаревшими с Mac OS X v10.4. и iOS2.0.

Сводка преобразований

В данной таблице приведены наиболее распространенные способы создания и преобразования строковых объектов:

ИсточникСоздающий методИзвлекающий метод
В коде@"..." создается компиляторомN/A
UTF8 кодированиеstringWithUTF8String:UTF8String
Unicode кодированиеstringWithCharacters:length:getCharacters:
getCharacters:range:
Произвольное кодированиеinitWithData:encoding:dataUsingEncoding:
Существующие строкиstringByAppendingString:
stringByAppendingFormat:
N/A
Форматирование строкlocalizedStringWithFormat:
initWithFormat:locale:
Исп. NSScanner
Локализованные строкиNSLocalizedString и аналогичныеN/A
 
 
homeЗаметили ошибкукарта сайта 
   Made on a Mac