В этой статье мы поговорим о строках в Objective-C, а точнее о двух классах NSString и NSMutableString. Отличие первого класса от второго состоит в том, что он не может быть изменен после создания. Если вам необходимо создать простую строку, чтобы вставить ее в свою программу используйте NSString, а если необходимо также провести ряд манипуляций (например, добавить к одной строке другую) — используйте NSMutableString.

Хотелось бы отметить, что в Objective-C для хранения и манипуляций со строками используется именно объект, а не набор байтов как в C. Это дает ряд преимуществ для программистов. Например, строку хранящуюся в объекте NSString легко можно конвертировать в любую нужную кодировку (сам массив символов хранится в Unicode).

Для вывода результатов будем использовать функцию NSLog(), которая выводит строку в консоль. В данном случае «строка» — это объект NSString. Консоль можно увидеть внизу окна XCode при запуске приложения. Если консоль не открывается, то выберите пункт меню View->Show Debug Area (⇧⌘Y).

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

Создание строки в Objective-C — очень простое действие:

NSString *firstString = @"Hello";

NSLog(@"%@", firstString);

Да, все просто — мы получили объект класса NSString, который хранит строку «Hello». Далее создадим вторую строку secondString, которая будет содержать в себе firstString:

NSString *firstString = @"Hello";

NSString *secondString = [firstString stringByAppendingString: @" world!"];
NSLog(@"%@", secondString);

Метод stringByAppendingString создает новую строку добавляя в конец первой строки слово world с пробелом. Таким образом новая строка будет содержать в себе «Hello world».

Рассмотрим еще несколько вариантов создания одной строки из другой. С помощью метода substringToIndex мы можем создать сроку из части другой строки:

NSString *firstString = @"0123456789";

NSString *secondString = [firstString substringToIndex:4];
NSLog(@"%@", secondString);

secondString будет равна «0123» — мы взяли первые четыре символа. Аналогичный метод substringFromIndex:

NSString *secondString = [firstString substringFromIndex:3];

NSLog(@"%@", secondString);

secondString будет равна «3456789» — мы убрали из строки первые три символа. Далее рассмотрим метода substringFromRange:

NSRange range = NSMakeRange(2, 4);

NSString *secondString = [firstString substringWithRange: range];
NSLog(@"%@", secondString);

Здесь мы создали диапазон range. Он начинается со второго символа и имеет длину четыре символа. secondString будет равна «2345». И последний метод componentSeparatedByString:

NSArray *array = [firstString componentsSeparatedByString:@"45"];

NSLog(@"%@", array);

C помощью этого метода мы разбиваем одну строку на массив, состоящий из нескольких строк. В данном примере мы разделили исходную строку на два элемента массива: «0123» и «6789».

Получить длину строки

NSUInteger len = [firstString lenght];

NSLog(@"%d", len);

Также можем воспользоваться еще одним методом получения длины текста (в нужной нам кодировке):

NSUInteger len = [firstString lengthOfBytesUsingEncoding: NSUTF8StringEncoding];

NSLog(@"%d", len);

Получение числа из строки

Часто бывает так, что мы получаем цифровые значения в виде строки. Для того чтобы преобразовать строку в нужное нам число помогут следующие методы:

  • floatValue
  • doubleValue
  • integerValue
  • boolValue

Пример использования данных методов:

CGFloat float = [firstString floatValue];

NSLog(@"%f", float);

Сравнение двух строк

Предположим, что у нас есть две строки firstString и secondString. Чтобы сравнить их между собой используем метод isEqualToString:

NSString *firstString = @"Hello";

NSString *secondString = @"Buy";
BOOL check = [firstString isEqualToString: secondString];

Переменная check будет равна NO. Данный метод достаточно часто придется использовать в ваших приложения. И как видите, все очень просто.

Сравнение строк (порядок)

Еще один метод, который позволяет сравнить строки — compare. С помощью него можно понять какая строка находится «выше» в алфавите:

NSString *firstString = @"AAA";

NSString *secondString = @"BBB";
NSString *thirdString = @"CCC";
NSString *fourthString = @"CCC";
if ([firstString compare:secondString] == NSOrderedAscending) {
NSLog(@"yes");
}
else {
NSLog(@"no");
}
if ([secondString compare:thirdString] == NSOrderedDescending) {
NSLog(@"yes");
}
else {
NSLog(@"no");
}
if ([thirdString compare:fourthString] == NSOrderedSame) {
NSLog(@"yes");
}
else {
NSLog(@"no");
}

Здесь мы делаем сравнение первой строки со второй (если она больше — то выводим «yes»), второй строки с третьей (если она меньше — то выводим «yes»), третьей строки с четвертой (если они равны — то выводим «yes»). В итоге должно получится: yes/no/yes.

Поиск одной строки внутри другой

NSString *firstString = @"first";

NSString *secondString = @"firstStringValue";
NSRange range = [secondString rangeOfString:firstString];
NSLog(@"%d, %d", range.location, range.length);

Результат, который хранится в range: {0, 5} означает, что искомая строка начинается нулевого знака (нумерация всегда идет с нуля) и занимает пять символов.

Поиск строки в тексте

Часто приходится выполнять поиск одной строки в большом тексте. И здесь нам поможет следующий метод — enumerateSubstringsInRange. С помощью его мы может задать поиск в большом объеме информации и вывести на экран те строки (или целые абзацы), где встречается искомая строка:

NSString *musician = @"Beatles";

NSString *musics = [NSString stringWithString:@"Beatles n Beatles n Nirvana n Fat Boy Slim n Go Beatles"];
[musics enumerateSubstringsInRange:NSMakeRange(0, [musics length]-1) options:NSStringEnumerationByLines usingBlock:^(NSString *substring, NSRange substringRange, NSRange enclosingRange, BOOL *stop)
{
NSRange found = [substring rangeOfString:musician];
if (found.location != NSNotFound) {
NSLog(@"%@", substring);
}
}];

В данном случае мы увидим на экране два раза «Beatles». Несмотря на то, что в исходном текст «Beatles» встречается три раза, мы задали условие поиска строки как она есть. Также мы используем «блоки» — usingBlock. Сама тема блоков заслуживает отдельной статьи. Здесь же заметим, что мы выполняем многократное сравнение строк с помощью знакомого нам NSRange.

Несколько примеров использования NSMutableString

NSString *firstString = @"0123456789";

NSMutableString *secondString = [NSMutableString stringWithString:@"New String: “];
[secondString appendString:firstString];
NSLog (@"%@", secondString);
Здесь мы сначала создаем пустую строку secondString и уже следующим действием добавляем к ней firstString. Результат будет выглядеть так: «New String: 0123456789».
[secondString replaceCharactersInRange:NSMakeRange (0, 4) withString: @"Old “];
NSLog (@"%@", secondString);

Дальше спокойно заменяем часть строки secondString новой строкой. Результат будет выглядеть так: «Old String: 0123456789».

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

Приведем пример создания строки из файла, находящегося внутри вашего приложения в кодировке UTF-8:

NSString *path = [[NSBundle mainBundle] pathForResource:@"filename" ofType:@"txt"];

NSError *error;
NSString *stringFromFileAtPath = [[NSString alloc] initWithContentsOfFile:path encoding:NSUTF8StringEncoding error:&error];
NSLog(@"%@", stringFromFileAtPath);

Создание строки c помощью URL

Приведем пример создания строки c помощью URL:

NSString *path = @"http://www.apple.com";

NSError *error;
NSString *string = [NSString stringWithContentsOfURL:[NSURL URLWithString:path] encoding:NSUTF8StringEncoding error:&error];
NSLog(@"%@", string);

В данном примере мы сначала получаем данные в объект data, а уже потом создаем строку из этого объекта. В данном случае необходимо знать заранее в какой кодировке у нас должна быть строка.

Форматирование строк

И в конце статьи рассмотрим наиболее часто используемую вещь — создание строки с помощью заданного формата. Диапазон использование достаточно широк — это и создание строки из двух строк, и создание строк из двух переменных разных типов и т.д. Для создания строки в данном случае используется метод stringWithFormat:

NSString *firstString = @"Hello";

NSString *secondString = [NSString stringWithFormat:@"Строка: %@ и дробное число: %1.2f", firstString, 31415.9265];
NSLog(@"%@", secondString);

В результате мы получим новый объект secondString, который будет хранить строку: «Строка: Hello и дробное число 31415.93». В данном методе внутри скобок вам нужно использовать специальные символ «%», который указывает на то, что здесь необходимо вставить объект (если это «%@») или дробное число (%f), или знак % (если это %% :) ). Как мы видим дробное число было округлено до двух знаков после запятой, так как мы использовали «%1.2f» — что указывает на необходимость округления.

Как мы видим строки в Objective-C — это достаточно простой и мощный инструмент, который востребован в любом приложении. Более детально с методами для работы со строками можно ознакомиться в документации. Там вы сможете ознакомится с расширенными возможностями поисках внутри строк, форматирования и многое другое.

Последние статьи

  • [Swift] Урок 1 — Пишем программу «Hello, World» на Swift языке под iOS

  • Audio Unit в iOS. Часть 3, накладываем эффект Delay

  • Audio Unit в iOS. Часть 2, строим граф и проигрываем файлы

  • Audio Unit в iOS. Часть 1, введение.

  • Используем Emoji в своих приложениях

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *