Содержание
В этой статье мы поговорим о строках в 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 в своих приложениях
Сообщить об опечатке
Текст, который будет отправлен нашим редакторам: