Данный документ содержит описание и краткие руководства по использованию различных механизмов библиотеки.
В связи с тем, что библиотека в настоящее время продолжает совершенствоваться, возможно некоторое отставание данного раздела от реального состояния программного кода. Поэтому кроме изучения данного руководства мы рекомендуем также изучать описания соответствующих классов и файлов библиотеки.
Список разделов руководства:
Введение
Библиотека Samond Classed Library представляет собой набор протоколов, классов и категорий, объединенных друг с другом для решения следующих основных задач:
- расширение функциональности стандартных классов Objective-C
- перенос под платформу Apple моих старых разработок на C++ для операционной системы UNIX
- использование разработанных решений более чем в одном проекте
В следующих разделах мы рассмотрим различные вопросы использования тех или иных компонентов библиотеки. Процесс изучения моих разработок мы будем сопровождать различными примерами.
Сразу хочу обратить Ваше внимание на то, что ряд моих компонентов в чем-то дублирует отдельные элементы функциональности стандартных классов, однако лично я не обращаю на это внимания, поскольку это позволяет при реализации проектов выбирать наиболее удобный и подходящий модуль.
Общие элементы классов
В этом разделе руководства мы рассмотрим компоненты библиотеки, благодаря которым все ее модули, вне зависимости от их типа, обладают одинаковой функциональностью. Для обеспечения этого как в наших собственных классах, так и в стандартных классах Objective-C в состав библиотеки входят обязательные для реализации протоколы:
Категория NSObject(SCObject)
Категория NSObject(SCObject) обеспечивает реализацию вышеприведенных протоколов, обеспечивая тем самым поддержку функционала библиотеки всеми классами, которые являются потомками класса NSObject. Благодаря этому при создании потомков класса NSObject и категорий его существующих дочерних классов избавляет от необходимости новой реализации протоколов - достаточно переопределить только минимально необходимые методы.
Класс SCObject
Все модули библиотеки (за исключением расширяющих функциональность стандартных классов категорий, а также классов исключительных ситуаций) являются потомками общего класса-предка SCObject. Начиная с версии 1.2.1 данный класс применяется в целях группировки собственных классов библиотеки, а в предыдущих версиях класс обеспечивал реализацию основных протоколов, которая теперь реализована в категории NSObject(SCObject).
Определение имен классов
Общие механизмы библиотеки для идентификации экземпляров классов используют метод, который в основных протоколах объявлен следующим образом:
Метод возвращает название класса, к которому относится данный экземпляр. Объявление данного метода необходимо из-за того, что его поддержка в стандартных классах обеспечивается не на всех платформах, тогда как мы стараемся сделать нашу библиотеку одинаковой в использовании вне зависимости от устройства, на котором будем выполняться использующее ее приложение.
При создании собственных потомков классов NSObject и SCObject необходимо переопределение данного метода. Также определение данного метода необходимо при расширении уже существующих классов (как стандартных, так и из состава сторонних библиотек).
Поддержка последовательных файлов и протокол SCCoding
Стандартные библиотеки Objective-C предоставляют в распоряжение программистов возможности по чтению и записи последовательных файлов (особая форма списков параметров plist). Для поддержки данных возможностей протокол SCCoding (является наследником стандартного протокола NSCoding) объявляет следующие методы:
- (instancetype)initWithContentsOfSerializedFile:(NSString *)path;
- (BOOL)writeContentsToSerializedFile:(NSString *)path;
- Метод initWithContentsOfSerializedFile: обеспечивает инициализацию экземпляра класса из последовательного файла с заданным путем.
- Метод writeContentsToSerializedFile: отвечает за запись экземпляра класса в последовательный файл с указанным путем к нему.
От стандартного протокола NSCoding протокол SCCoding наследует методы для взаимодействия со стандартными кодировщиками (NSCoder):
- (instancetype)initWithCoder:(NSCoder *)coder;
- (void)encodeWithCoder:(NSCoder *)coder;
- Метод initWithCoder: выполняет инициализацию экземпляра класса с использованием данных из указанного кодировщика.
- Задачей метода encodeWithCoder: является сохранение данных экземпляра класса в заданном кодировщике.
Данные методы подлежат перекрытию в дочерних классах при наличии в них собственных полей данных. Если дочерний класс таковых не содержит, а только объявляет новые или перекрывает существующие методы, необходимости переопределения данных методов нет.
Подробнее с работой последовательных файлов Вы можете ознакомиться в разделе руководства Взаимодействие с последовательными файлами.
Поддержка словарей и протокол SCDictionaring
Стандартные классы NSDictionary и NSMutableDictionary обеспечивают возможности хранения информации в виде списков параметров plist. Данный способ хранения используется нашей библиотекой как один из способов сохранения данных экземпляров классов.
Протокол SCDictionaring объявляет необходимыми к реализации следующие методы:
- (instancetype)initWithDataDictionary:(NSDictionary *)dictionary;
- (instancetype)initWithDataDictionaryFromFile:(NSString *)path;
- (void)writeToDataDictionary:(NSMutableDictionary *)dictionary;
- (void)writeToDataDictionaryFile:(NSString *)path atomically:(BOOL)atomically;
- (void)writeToDataDictionaryFile:(NSString *)path;
- (NSDictionary *)dataDictionary;
- initWithDataDictionary: выполняет инициализацию экземпляра класса из заданного словаря
- initWithDataDictionaryFromFile: инициализирует экземпляр класса из указанного файла параметров
- writeToDataDictionary: сохраняет данные экземпляра класса в указанном словаре
- writeToDataDictionaryFile:atomically: и writeToDataDictionaryFile: записывают экземпляр класса в указанный файл параметров
- dataDictionary: возвращает словарь с сохраненными в нем данными экземпляра класса
Если дочерний класс содержит собственные данные, то необходимо переопределять методы initWithDataDictionary: и writeToDataDictionary:.
Работа со словарями подробно описана в соответствующем разделе данного руководства.
Поддержка потоков и протокол SCStreaming
Потоки - реализованные на базе класса SCStream механизмы, обеспечивающие потоковую передачу данных с использованием различных технологий - в настоящее время поддерживаются файловые потоки, стандартные потоки ввода-вывода и поток нулевого вывода.
Необходимые для взаимодействия с потоками методы объявлены в протоколе SCStreaming:
- (instancetype)initWithStream:(
SCStream *)stream;
- (instancetype)initWithFileStream:(NSString *)path;
- (void)writeToStream:(
SCStream *)stream;
- (void)writeToFileStream:(NSString *)path;
- (void)appendToFileStream:(NSString *)path;
- initWithStream: инициализирует экземпляр класса с использованием данных из указанного потока
- initWithFileStream: выполняет инициализацию с помощью данных из заданного файлового потока
- writeToStream: сохраняет данные экземпляра класса в указанном потоке
- writeToFileStream: сохраняет экземпляр класса в файловом потоке с указанным путем к нему
- appendToFileStream: добавляет данные экземпляра класса к файловому потоку
Методы initWithStream: и writeToStream: должны быть перекрыты при наличии в дочерних классах собственных данных.
Подробности работы с потоками описаны в разделе Потоки.
Поддержка коллекций и протокол SCCollectioning
Коллекции - наборы различных данных и экземпляров класса, реализованные как в виде отдельной иерархии классов на базе SCCollection, так и в виде расширения ряда стандартных классов. Для поддержки данного механизма протокол SCCollectioning требует реализации следующих методов:
- copyObject - создает точную копию экземпляра класса (требуется перекрытие в каждом дочернем классе и в каждой дочерней категории
- compareWithObject: - возвращает результат сравнения двух экземпляров класса (перекрывается при необходимости)
Метод compareWithObject: возвращает одно из следующих значений:
Описание работы механизма коллекций приводится в соответствующем разделе документации.
Функциональность библиотеки и стандартные классы
Как было отмечено выше, при работе с потомками класса SCObject для взаимодействия с различными механизмами библиотеки необходимо переопределять только часть методов.
Однако при реализации функционала в расширяющих стандартные классы категориях реализации подлежат все методы соответствующих протоколов.
Взаимодействие с последовательными файлами
Последовательные файлы (serialized files) представляют собой специальную версию файлов свойств (property list - plist), которые позволяют в текстовых файлах XML хранить различные данные. При этом для чтения и записи используются кодировщики на базе стандартного класса NSCoder.
Основная функциональность работы с последовательными файлами реализована в стандартном протоколе NSCoding. SCL расширяет данную функциональность прежде всего в целях приведения ее к общему с остальными механизмами формату.
Данный раздел руководства описывает приемы и методы работы с последовательными файлами. Требования к классам изложены в разделе Поддержка последовательных файлов и протокол SCCoding. Отметим, что главное требование - соответствие класса протоколу SCCoding.
Сохранение экземпляров класса
Запись в последовательный файл осуществляется с помощью метода writeContentsToSerializedFile:, в качестве параметра которого указывается путь к последовательному файлу. Если операция записи прошла успешно, метод возвращает значение YES, в противном случае возвращается значение NO. Если последовательный файл уже существует, то его содержимое уничтожается.
NSString *sourceString = @"Sample source string";
if ( [sourceString writeContentsToSerializedFile:@"/tmp/serial.plist"]) {
NSLog( @"Writing complited");
} else {
NSLog( @"Writing error");
}
2016-06-17 02:24:14.644 libtest[14033:493323] Writing complited
Получившийся в результате исполнения примера последовательный файл:
Загрузка экземпляров класса
Инициализация экземпляра класса на основании данных из последовательного файла выполняется с помощью метода initWithContentsOfSerializedFile:, которому в качестве параметра передается путь к последовательному файлу.
NSString *string = [[NSString alloc] initWithContentsOfSerializedFile:@"/tmp/serial.plist"];
NSLog( @"%@", string);
2016-06-17 02:57:16.339 libtest[14308:521945] Sample source string
Во многих классах и категориях дополнительно определяются классовые методы, которые возвращают загруженные из последовательных файлов и инициализированные экземпляры классов:
+ (
SCArray *)arrayWithCoder:(NSCoder *)coder;
+ (
SCArray *)arrayWithContentsOfSerializedFile:(NSString *)path;
Работа со словарями
Словари на базе стандартных классов NSDictionary и NSMutableDictionary обеспечивают доступ к универсальным хранилищам данных, работающим по принципу "ключ-значение", согласно которому доступ к хранимым данным осуществляется посредством ключей, в качестве которых могут выступать экземпляры любых объектов Objective-C.
Словари напрямую связаны со списками свойств (property list). Благодаря этому в распоряжении программистов оказываются не только простые средства по организации универсальных хранилищ, но и возможности по контролю и редактированию этих хранилищ - встроенный в Xcode редактор списков свойств обеспечивает удобный доступ к данным.
Со словарями могут взаимодействовать экземпляры классов, которые соответствуют протоколу SCDictionaring. Описание реализации данного протокола приведено в разделе Поддержка словарей и протокол SCDictionaring.
Запись в словарь
Основным методом для записи данных в словарь является метод writeToDataDictionary:, которому в качестве параметра передается изменяемый словарь (класс NSMutableDictionary), в который и производится запись данных экземпляра класса. Именно этот метод подлежит перекрытию в дочерних классах при необходимости сохранять в словарях отличные от класса-предка данные.
Приведем пример сохранения в словаре экземпляра класса SCDictionary:
[sourceDictionary setBool:NO forKey:@"Verbose"];
[sourceDictionary setInteger:2319 forKey:@"Build"];
NSMutableDictionary *dictionary = [NSMutableDictionary dictionary];
[sourceDictionary writeToDataDictionary:dictionary];
NSLog( @"%@", dictionary);
2016-06-17 04:19:36.502 libtest[14651:578461] {
Dictionary = {
Build = {
Number = 2319;
"OBJC_ClassName" = NSNumber;
};
Startup = {
Date = "2016-06-17 01:19:36 +0000";
};
System = {
"OBJC_ClassName" = NSString;
String = MacOS;
};
Verbose = {
Number = 0;
"OBJC_ClassName" = NSNumber;
};
};
Name = Configuration;
"Read Only" = 0;
}
Метод и свойство dataDictionary возвращают словарь с данными экземпляра класса:
NSString *sourceString = @"Sample UTF-8 string";
NSLog( @"%@", sourceString.dataDictionary);
2016-06-17 04:25:17.156 libtest[14713:582644] {
"OBJC_ClassName" = NSString;
String = "Sample UTF-8 string";
}
Запись экземпляра класса в файл свойств осуществляется следующими методами:
- (void)writeToDataDictionaryFile:(NSString *)path atomically:(BOOL)atomically;
- (void)writeToDataDictionaryFile:(NSString *)path;
Оба метода в качестве аргумента принимают путь к файлу. Если данный файл существует, его содержимое уничтожается. Разница между ними в том, что у первого из них параметр atomically: позволяет указать, будет ли запись в файл производиться непосредственно (NO) или через промежуточный файл (YES). Второй метод всегда осуществляет запись через промежуточный файл.
[sourceDictionary setBool:NO forKey:@"Verbose"];
[sourceDictionary setInteger:2319 forKey:@"Build"];
После выполнения данного кода создается файл со следующим содержимым:
Чтение из словаря
Для загрузки экзепляров классов из словарей и файлов свойств применяются следующие методы:
- (instancetype)initWithDataDictionary:(NSDictionary *)dictionary;
- (instancetype)initWithDataDictionaryFromFile:(NSString *)path;
Метод initWithDataDictionary: инициализирует экземпляр класса из указанного в качестве аргумента словаря. Путем перекрытия данного метода осуществляется добавление в дочерние классы поддержки загрузки из словарей их собственных данных.
С помощью метода initWithDataDictionaryFromFile: осуществляется инициализация экземпляра класса из файла свойств с путем к нему в качестве аргумента метода.
Во многих классах и категориях дополнительно определяются классовые методы, которые возвращают загруженные из словарей и файлов свойств и инициализированные экземпляры классов:
+ (
SCQueue *)queueWithDataDictionary:(NSDictionary *)dictionary;
+ (
SCQueue *)queueWithDataDictionaryFromFile:(NSString *)path;
Потоки
Потоки представляют собой группу классов, которые реализуют концепцию байт-ориентированных средств ввода-вывода информации. Согласно данной концепции, потоки осуществляю ввод и вывод данных без какой-либо обработки (за исключением работы с экземплярами классов и текстовых строк - их обработка является частью механизма потоков).
Иерархия классов потоков
Общим предком всех классов потоков является класс SCStream, который определяет все механизмы работы потоков, за исключением непосредственно операций ввода и вывода - предназначенные для осуществления данных операций методы в классе SCStream являются абстрактными.
Дочерние классы в обязательном порядке переопределяют методы операций ввода и вывода, а при необходимости дополняют методы, которые являются специфическими для конкретных видов потоков. Например, дочерний класс SCFileStream объявляет методы открытия и закрытия файловых потоков.
Описание работы потоков мы начинаем с методов класса SCStream, однако из-за его абстрактности в примерах мы будем использовать экземпляры классов реальных потоков, прежде всего SCFileStream. После завершения описания общих для всех методов и приемов мы перейдем к описанию конкретных классов потоков.
Обработка ошибок при работе с потоками
При работе с потоками могут возникать различные ошибки, связанные как непосредственно с потоками (или конкретными классами потоков), так и возникающие за пределами нашего кода, например при попытке записи в доступный только для чтения файл.
Режим обработки ошибок определяется через свойство errorHandling и может принимать одно из следующих значений:
По умолчанию используется режим, при котором генерируется исключительная ситуация SCStreamException.
Генерация исключительной ситуации SCSystemException
Режим включается через прямое или косвенное назначение свойству errorHandling значения SCStreamErrorHandlingSystem.
При использовании данного варианта ошибок механизм потоков генерирует исключительную ситуацию SCSystemException, которая содержит информацию об ошибке, которая была возвращена либо системным вызовом, либо вызовом стандартных библиотек. Основной информацией является свойство error, содержащее идентификатор возникшей системной ошибки. Более подробную информацию содержит раздел руководства программиста, посвященный исключительной ситуации Класс SCSystemException.
Приведем пример использования данного способа обработки ошибок:
2016-07-05 23:01:53.322 libtest[5608:1486493] SCL-20002: No such file or directory (2, /tmp/error.txt)
Генерация исключительной ситуации SCStreamException
Режим включается через прямое или косвенное назначение свойству errorHandling значения SCStreamErrorHandlingStream.
Данный вариант обработки ошибок при их возникновении генерирует исключительную ситуацию SCStreamException, которая содержит информацию, помогающую определить причины возникновения ошибок. В отличие от класса SCSystemException, исключительная ситуация SCStreamException содержит информацию, специфическую именно для механизма потоков.
С помощью данной исключительной ситуации могут быть обработаны следующие ошибки при работе с потоками:
Дочерние классы потоков могут создавать свои собственные исключительные ситуации, являющиеся потомками класса SCStreamException, например класс SCFileStream для обработки своих собственных ошибок использует исключительную ситуацию SCFileStreamException.
Приведем пример обработки ошибок потоков через генерацию исключительной ситуации SCStreamException:
2016-07-05 22:52:34.159 libtest[5534:1475780] SCL-20029: Stream "/tmp/start.txt" open error (2)
Изменение состояния потока
Режим включается через прямое или косвенное назначение свойству errorHandling значения SCStreamErrorHandlingStatus.
При использовании данного варианта обработки ошибок механизм потоков работает по следующему алгоритму:
Приведем пример обработки ошибок с помощью данного способа:
NSLog(
@"Stream status: %d", stream.
status);
2016-07-05 23:19:45.803 libtest[5678:1502988] Stream status: -20029
Определение состояния потока
Состояние потока определяется свойством:
@property (nonatomic, assign, readonly, getter=status)
SCStreamStatus status;
Непосредственно класс SCStream через тип SCStreamStatus определяет следующие состояния потоков:
Дочерние классы могут определять свои собственные производные типы состояний потоков. Например, класс SCFileStream определяет тип SCFileStreamStatus, расширяющий базовые коды состояний потоков. Подробности данного расширения описывается в соответствующем разделе руководства программиста.
Свойства потоков
Класс SCStream содержит объявление следующих свойств:
@property (nonatomic, assign, getter=errorHandling, setter=setErrorHandling:)
SCStreamErrorHandling errorHandling;
@property (nonatomic, assign, readonly, getter=status)
SCStreamStatus status;
@property (nonatomic, retain, readonly, getter=name) NSString *name;
@property (nonatomic, assign, readonly, getter=opened) BOOL opened;
@property (nonatomic, assign, readonly, getter=eof) BOOL eof;
@property (nonatomic, assign, getter=delegate, setter=setDelegate:) id<SCStreamDelegate> delegate;
@property (nonatomic, assign, readonly, getter=readable) BOOL readable;
@property (nonatomic, assign, readonly, getter=writable) BOOL writable;
@property (nonatomic, assign, readonly, getter=readOnly) BOOL readOnly;
@property (nonatomic, assign, readonly, getter=writeOnly) BOOL writeOnly;
@property (nonatomic, assign, readonly, getter=readWrite) BOOL readWrite;
@property (nonatomic, assign, readonly, getter=streamException)
SCStreamException *streamException;
@property (nonatomic, assign, readonly, getter=systemException)
SCSystemException *systemException;
- свойство errorHandling определяет способ обработки возникших в ходе работы с потоком ошибок. Более подробно работа с данным свойством описано в разделе Обработка ошибок при работе с потоками.
- свойство status (только для чтения) позволяет программисту определить текущее состояние потока. Работа с данным свойством описана в разделе Определение состояния потока.
- свойство name (только для чтения) обеспечивает доступ к имени потока. Для файловых потоков на основе класса SCFileStream таковым выступает путь к соответствующему файлу.
- свойство opened (только для чтения) имеет значение YES для открытого потока и NO, если данный поток не открыт.
- свойство eof (только для чтения) возвращает YES при достижении конца потока. В классе SCStream данное свойство является абстрактным и подлежит перекрытию в дочерних классах.
- свойство delegate предоставляет доступ к объекту делегирования потока. Подробно работа с объектами делегирования описаны в разделе Протокол делегирования SCStreamDelegate.
- свойства readable и writable (только для чтения) позволяют определить, поддерживает ли поток операции чтения и записи соответственно.
- свойство readOnly (только для чтения) возвращает YES для потоков, которые не поддерживают операции записи (открыты только для чтения) и NO в случае потоков, которые поддерживают операции записи.
- свойство readWrite (только для чтения) возвращает YES для потоков, которые поддерживают одновременно как операции чтения, так и операции записи.
Дочерние классы могут определять свои собственные свойства.
Чтение данных из потока
Основной метод чтения данных из потока объявлен в классе SCStream следующим образом:
Данный метод считывает из потока указанное количество символов в буфер с заданным указателем. В качестве значения метод возвращает количество реально считанных символов. В базовом классе SCStream метод является абстрактным и должен быть перекрыт во всех дочерних классах, поддерживающих операции чтения данных.
Кроме основного метода чтения класс SCStream определяет специализированные методы, обеспечивающие чтение в указанные буферы данных соответствующих типов. Фактически данные методы вызывают основной метод readBytes:toBuffer: со скрытым указанием количества символов, соответствующих данному типу. В качестве значения методы также возвращают количество реально считанных символов.
- (
SCSize)readToChar:(
char *)buffer;
- (
SCSize)readToUnichar:(unichar *)buffer;
- (
SCSize)readToBool:(BOOL *)buffer;
- (
SCSize)readToNSInteger:(NSInteger *)buffer;
- (
SCSize)readToNSUInteger:(NSUInteger *)buffer;
Также в классе SCStream объявлены методы, которые возвращают считанные из потока данные соответствующих типов:
- (char)readChar;
- (unichar)readUnichar;
- (const char *)readCharString;
- (BOOL)readBool;
- (NSInteger)readNSInteger;
- (NSUInteger)readNSUInteger;
Обращаем внимание, что чтение данных из потока возможно только в том случае, если данный поток поддерживает операции чтения данных. В противном случае механизм потоков фиксирует ошибку.
Запись данных в поток
Класс SCStream объявляет следующий основной метод для записи данных в поток:
- (
SCSize)writeBytes:(
SCSize)count fromBuffer:(const
void *)buffer;
Этот метод записывает в поток указанное количество символов из буфера с заданным указателем и возвращает количество реально записанных символов. Базовый класс SCStream содержит только абстрактное объявление данного метода, которое подлежит перекрытию в дочерних классах, которые поддерживают операции записи.
Для облегчения работы со стандартными типами данных класс SCStream объявляет методы записи в поток переменных таких типов.
- (void)writeByte:(
SCByte)variable;
- (void)writeUByte:(
SCUByte)variable;
- (void)writeShort:(
SCShort)variable;
- (void)writeLong:(
SCLong)variable;
- (void)writeULong:(
SCULong)variable;
- (void)writeChar:(char)variable;
- (void)writeUnichar:(unichar)variable;
- (void)writeCharString:(const char *)variable;
- (void)writeBool:(BOOL)variable;
- (void)writeFloat:(
SCFloat)variable;
- (void)writeNSInteger:(NSInteger)variable;
- (void)writeNSUInteger:(NSUInteger)variable;
Хочу обратить внимание, что запись данных в поток возможна только в том случае, если данный поток поддерживает операции записи. Если методы записи будут вызваны для потоков, не поддерживающих такие операции, механизм потоков зафиксирует ошибку.
Потоки и классы
Хотя в основе работы потоков лежит посимвольная передача данных, основным назначением потоков является передача объектов (экземпляров класса). С потоками могут взаимодействовать только экземпляры классов, которые соответствуют протоколу SCStreaming.
Методы протокола SCStreaming
Для взаимодействия с потоками протокол SCStreaming объявляет следующие методы:
- (void)writeToStream:(
SCStream *)stream;
- (instancetype)initWithStream:(
SCStream *)stream;
- метод writeToStream: сохраняет данные экземпляра класса в указанном потоке любого типа
- метод initWithStream: вызывается механизмом потоков для загрузки данных экземпляра класса из указанного в качестве аргумента потока.
Кроме метода инициализации экземпляра класса может объявляться классовый метод для создания экземпляра класса на основании данных из потока. Приведем пример такого объявления в категории NSString(SCString):
+ (NSString *)stringWithStream:(
SCStream *)stream;
Кроме данных методов протокола SCStreaming в классах и категориях могут объявляться методы для создания экземпляров классов на основе данных из потоков. Приведем пример таких методов в категории NSString(SCString):
+ (NSString *)stringWithStream:(
SCStream *)stream;
Класс SCFileStream использует ряд других методов протокола SCStreaming, которые описываются в соответствующем разделе руководства программиста.
Методы класса SCStream
Для загрузки и записи объектов используются следующие методы класса SCStream:
С помощью метода writeObject: осуществляется запись существующего экземпляра класса в поток. Непосредственно перед записью механизм потоков идентифицирует класс, к которому относится сохраняемый экземпляр и записывает в поток служебную информацию, необходимую для последующей загрузки сохраненного экземпляра. Затем поток вызывает метод writeToStream: экземпляра класса, который и записывает в поток собственные данные экземпляра.
Метод readObject на основании служебной информации в потоке определяет, к какому классу относится загружаемый объект, создает экземпляр соответствующего класса и передает управление методу initWithStream:, который и осуществляет загрузку данных именно необходимого класса.
Приведем пример использования методов writeObject: и readObject:
[outputStream
writeObject:[NSNumber numberWithInteger:19091975]];
while ( YES) {
if ( !object) break;
NSLog( @"Object %d: %@", counter, object);
counter++;
}
2016-07-06 15:37:15.691 libtest[8743:2490662] Object 0: Sample String
2016-07-06 15:37:15.692 libtest[8743:2490662] Object 1: This is a test
2016-07-06 15:37:15.693 libtest[8743:2490662] Object 2: <null>
2016-07-06 15:37:15.694 libtest[8743:2490662] Object 3: 19091975
Потоки и текстовые файлы
В отличие от обычных файлов, текстовые файлы состоят не из последовательности символов, а из строк символов различной длины, каждая из которых заканчивается специальным символов конца строки. Для работы с такими данными механизм потоков в классе SCStream объявляет ряд методов.
Запись строк в текстовый файл осуществляется через следующие методы:
- (void)writeString:(NSString *)string encoding:(NSStringEncoding)encoding;
- (void)writeString:(NSString *)string;
- метод writeString:encoding: записывает в текстовый файл указанную строку с использованием заданной кодировки
- метод writeString: записывает в поток указанную строку в кодировке UTF-8
Приведем пример записи текстовых строк в выходной поток:
This is a test
This is a test again
Чтение текстовых данных из потоков осуществляется с помощью методов:
- (NSString *)readStringWithEncoding:(NSStringEncoding)encoding max:(
SCInteger)max;
- (NSString *)readStringWithEncoding:(NSStringEncoding)encoding;
- (NSString *)readStringWithMax:(
SCInteger)max;
- (NSString *)readString;
- метод readStringWithEncoding:max: возвращает считанную из потока строку с использованием указанной кодировки и заданной максимальной длиной. Если строка в потоке превышает максимальную длину, выходящие за ее пределы символы будут отброшены.
- метод readStringWithEncoding: считывает из потока и возвращает строку с применением указанной кодировки.
- метод readStringWithMax: возвращает загруженную из потока строку в кодировке UTF-8 с заданной максимальной длиной.
- метод readString загружает и возвращает загруженную из потока строку с использованием кодировки UTFC-8.
Приведем пример чтения строк из потока:
NSString *string;
while ( ( string = [file readString])) NSLog( @"%@", string);
2016-07-06 17:46:00.777 libtest[9504:2628316] #
2016-07-06 17:46:00.777 libtest[9504:2628316] # /etc/afpovertcp.cfg is used to set the system-wide AFP defaults
2016-07-06 17:46:00.777 libtest[9504:2628316] # for the LibcAT AppleTalk library.
2016-07-06 17:46:00.778 libtest[9504:2628316] #
2016-07-06 17:46:00.778 libtest[9504:2628316] # Copyright 1998 Apple Computer, Inc.
2016-07-06 17:46:00.778 libtest[9504:2628316] #
2016-07-06 17:46:00.778 libtest[9504:2628316] # If this file exists, TCP/IP will be used as the default transport
2016-07-06 17:46:00.778 libtest[9504:2628316] # protocol for AFP. Otherwise ATP will be used.
2016-07-06 17:46:00.778 libtest[9504:2628316] #
2016-07-06 17:46:00.779 libtest[9504:2628316] # Supported commands are:
2016-07-06 17:46:00.779 libtest[9504:2628316] #
2016-07-06 17:46:00.779 libtest[9504:2628316] # quantum [quantum size]
2016-07-06 17:46:00.779 libtest[9504:2628316] # 16384 is a reasonable value; 4624 is the default.
2016-07-06 17:46:00.814 libtest[9504:2628316] #
2016-07-06 17:46:00.814 libtest[9504:2628316] # port [TCP listen port]
2016-07-06 17:46:00.814 libtest[9504:2628316] # The default is 548.
2016-07-06 17:46:00.815 libtest[9504:2628316] #
2016-07-06 17:46:00.815 libtest[9504:2628316] # It is legal for this file to exist and for it to have no contents.
2016-07-06 17:46:00.815 libtest[9504:2628316] #
2016-07-06 17:46:00.815 libtest[9504:2628316] quantum 16384
Протокол делегирования SCStreamDelegate
Если для потока задан объект делегирования, соответствующий протоколу SCStreamDelegate, при наступлении определенных событий механизм потоков будет вызывать соответствующие методы объекта делегирования.
Протокол делегирования определяет методы для реакции на следующие события:
Дочерние классы могут добавлять в объект делегирования обработчики собственных событий. Именно так делает класс SCFileStream.
Полный список методов приведен в описании соответствующих протокола и класса SCStreamDelegate.
Статистические данные
В ходе своей работы поток ведет накопление базовой статистической операции. Доступ к таким данным осуществляется через объявленные в классе SCStream статистические свойства (доступны только для чтения):
@property (nonatomic, assign, readonly, getter=totalRead)
SCULong totalRead;
@property (nonatomic, assign, readonly, getter=totalWrite)
SCULong totalWrite;
@property (nonatomic, assign, readonly, getter=lastRead)
SCULong lastRead;
@property (nonatomic, assign, readonly, getter=lastWrite)
SCULong lastWrite;
- свойство totalRead отображает общее количество символов, которые были прочитаны с момента открытия потока
- свойство totalWrite содержит суммарное количество символов, записанных в поток с момента его открытия.
- свойство lastRead позволяет программисту выяснить количество символов, считанных из потока в ходе последней операции чтения.
- свойство lastWrite дает доступ к количеству символов, записанных в поток во время последней операции записи.
Для сброса статистических данных применяется метод resetStats.
Файлы и класс SCFileStream
Как уже говорилось, класс SCStream является абстрактным классом и не может быть использован напрямую. Поэтому были созданы различные дочерние классы, центральным из которых является класс файловых потоков SCFileStream, то есть класс, который реализует один из наиболее популярных видов потоков - дисковых файлов. Данный раздел руководства рассматривает различные аспекты работы класса SCFileStream.
Методы протокола SCStreaming
Протокол SCStreaming для взаимодействия с файловыми потоками объявляет следующие методы:
- (void)writeToFileStream:(NSString *)path;
- (void)appendToFileStream:(NSString *)path;
- (instancetype)initWithFileStream:(NSString *)path;
- метод writeToFileStream: сохраняет данные экземпляра класса в файловом потоке с указанным путем к файлу. Если указанный файл существует, его предыдущее содержимое уничтожается.
- метод appendToFileStream: добавляет данные экземпляра класса к файлу с указанным путем к нему. Если указанного файла не сущесвует, он создается.
- метод initWithFileStream: выполняет инициализацию экземпляра класса на основе данных из файлового потока с указанным путем к файлу.
Кроме метода инициализации экземпляра класса может объявляться классовый метод для создания экземпляра класса на основании данных из файлового потока. Приведем пример такого объявления в категории NSString(SCString):
+ (NSString *)stringWithFileStream:(NSString *)path;
Ниже мы приводим пример работы методов протокола SCStreaming с файловыми потоками:
NSString *source = @"This is a test again";
[source writeToFileStream:@"/tmp/string.dat"];
NSString *string = [NSString stringWithFileStream:@"/tmp/string.dat"];
NSLog( @"%@", string);
2016-07-06 16:34:03.204 libtest[9064:2557807] This is a test again
Обработка ошибок файлового потока
Ошибки файловых потоков обрабатываются точно также, как и ошибки класса SCStream. Отличие состоит только в том, что в дополнение к исключительной ситуации SCStreamException класс SCFileStream генерирует исключительные ситуации SCFileException, которые обрабатывают следующие специфические для файловых потоков ошибки:
Определение состояния файлового потока
В дополнение к кодам состояний класса SCStream класс файловых потоков SCFileStream через дополнительный тип SCFileStreamStatus следующие коды состояния:
Режимы открытия файловых потоков
Файловый поток может быть открыт в различных режимах. Режим открытия определяется свойством (только для чтения) класса SCFileStream:
Тип SCFileStreamOpenMode определяет следующие режимы открытия файловых потоков:
- SCFileStreamOpenReadOnly - файл открывается в режиме только для чтения, указатель позиционируется в начало потока.
- SCFileStreamOpenReadWrite - файл открывается на чтение и запись, указатель позиционируется в начало потока.
- SCFileStreamOpenWriteOnly - файл открывается в режиме только для записи, указатель позиционируется в начало потока. Если файл уже существует, его содержимое удаляется, в противном случае создается пустой файл.
- SCFileStreamOpenWriteRead - файл открывается на чтение и запись, указатель позиционируется в начало потока. Если файл уже существует, его содержимое удаляется, в противном случае создается пустой файл.
- SCFileStreamOpenAppendWriteOnly - файл открывается на добавление данных. Если файл не существует, он создается, в противном случае указатель позиционируется в конец данных. Добавление данных всегда производится в конец файла вне зависимости от позиции указателя.
- SCFileStreamOpenAppendReadWrite - файл открывается на чтение и добавление данных. Если файл не существует, он создается, в противном случае указатель позиционируется в конец данных. Добавление данных всегда производится в конец файла вне зависимости от позиции указателя.
Режим открытия определяется при вызове методов открытия, инициализации и создания потоков и не меняется во время операций чтения, записи и позиционирования. Изменение режима открытия без предварительного закрытия и последующего нового открытия потока невозможно.
Открытие и закрытие файловых потоков
Класс SCFileStream объявляет следующие методы открытия файловых потоков:
- (void)openWithPath:(NSString *)path;
- (void)openReadOnlyWithPath:(NSString *)path;
- (void)openWriteOnlyWithPath:(NSString *)path;
- (void)openAppendWithPath:(NSString *)path;
- Метод openWithPath:mode:handling: открывает файловый поток с использованием следующих параметров:
- Метод openWithPath:mode: является основным методом открытия файлового потока. Остальные методы открытия, инициализации и создания для осуществления операции вызывают данный метод. При этом обработка ошибок осуществляется в соответствии со значением свойства errorHandling непосредственно перед вызовом метода.
- С помощью метода openWithPath: открывается файловый поток с указанным путем к нему в режиме чтения и записи (SCFileStreamOpenReadWrite). Обработка ошибок осуществляется в соответствии с текущим значением свойства errorHandling.
- Метод openReadOnlyWithPath: открывает файловый поток с указанным путем к файлу в режиме только для чтения (SCFileStreamOpenReadOnly).
- С помощью метода openWriteOnlyWithPath: файл с указанным путем открывается в режиме только для записи (если файл не существует, то он создается, в противном случае старое содержимое файла уничтожается - режим SCFileStreamOpenWriteOnly).
- Метод openAppendWithPath: открывает указанный в качестве параметра файл в режиме добавления данных (SCFileStreamOpenAppendWriteOnly). Если файл существует, то запись будет производиться в конец файла, а при отсутствии файла он будет создан.
При успешном открытии состояние потока устанавливается равным SCFileStreamOK, а свойство opened возвращает значение YES. Если какой-либо метод вызывается для уже открытого потока (opened == YES), то вызов метода игнорируется - поток остается в предыдущем режиме и состоянии.
Для закрытия потока в классе SCFileStream объявлен следующий метод:
Метод закрывает ранее открытый файловый поток и сбрасывает значение свойства opened в значение NO. Попытка вызова метода для закрытого потока игнорируется.
Создание файловых потоков
Класс SCFileStream объявляет следующие методы для создания файловых потоков:
+ (instancetype)fileStreamWithPath:(NSString *)path
+ (instancetype)fileStreamWithPath:(NSString *)path;
+ (instancetype)readOnlyFileStreamWithPath:(NSString *)path;
+ (instancetype)writeOnlyFileStreamWithPath:(NSString *)path;
+ (instancetype)appendFileStreamWithPath:(NSString *)path;
+ (instancetype)fileStream;
- Классовый метод fileStreamWithPath:mode:delegate:handling: создает и открывает файловый поток с заданными путем, режимом открытия, объектом делегирования и режимом обработки ошибок.
- Классовый метод fileStreamWithPath:mode:delegate: возвращает созданный и открытый файловый поток с указанными путем к файлу, режимом открытия и объектом делегирования. Обработка ошибок в созданном потоке осуществляется путем генерации исключительных ситуаций SCStreamException.
- С помощью классового метода fileStreamWithPath:mode: создается и открывается файловый поток с заданными путем к файлу и режимом открытия. Объект делегирования не назначается, при возникновении ошибок генерируются исключительные ситуации SCStreamException.
- Классовый метод fileStream создает файловый поток со значениями свойств по умолчанию. Метод возвращает указатель на неоткрытый поток.
Все методы, кроме fileStream, осуществляют открытие созданного файлового потока. Если данная операция прошла успешно, то свойству opened присваивается значение YES, а свойство status принимает значение SCFileStreamOK.
Приводим пример использования методов создания файловых потоков:
NSLog(
@"/etc/ttys status: %d", ttys.
status);
if ( ttys.
opened) NSLog(
@"/etc/ttys is opened");
2016-07-07 03:20:14.014 libtest[11678:3116658] /etc/ttys status: 0
2016-07-07 03:20:14.014 libtest[11678:3116658] /etc/ttys is opened
Инициализация файловых потоков
В классе SCFileStream объявляются следующие методы инициализации экземпляров классов. Данные методы могут быть использованы как напрямую, так и через обращение к методам создания файловых потоков, которые описаны в предыдущем разделе руководства.
- (instancetype)initWithPath:(NSString *)path
- (instancetype)initWithPath:(NSString *)path;
- (instancetype)initReadOnlyWithPath:(NSString *)path;
- (instancetype)initWriteOnlyWithPath:(NSString *)path;
- (instancetype)initAppendWithPath:(NSString *)path;
- (instancetype)init;
- Метод initWithPath:mode:delegate:handling: инициализирует и открывает файловый поток с указанными путем к файлу, режимом открытия, объектом делегирования и методом обработки ошибок. Является выделенным инициализатором класса SCFileStream.
- Метод initWithPath:mode:delegate: инициализирует и открывает файловый поток с указанными путем к файлу, режимом открытия и объектом делегирования. Возможные ошибки в потоке обрабатываются через генерацию исключительных ситуаций SCStreamException.
- Метод initWithPath:mode: используется для инициализации и открытии файлового потока с заданными путем к файлу и режимом открытия. Объект делегирования не назначается, а потенциальные ошибки обрабатываются путем генерации исключительных ситуаций SCStreamException.
- Метод initWithPath: выполняет инициализацию и открытие файлового потока с использованием указанного пути к файлу в режиме чтения и записи (SCFileStreamOpenReadWrite). Ошибки обрабатываются через генерацию исключительных ситуаций SCStreamException. Объект делегирования не назначается.
- Метод init инициализирует файловый поток без его открытия и со свойствами по умолчанию.
Все методы, кроме init, осуществляют открытие инициализированного файлового потока. Если данная операция прошла успешно, то свойству opened присваивается значение YES, а свойство status принимает значение SCFileStreamOK.
Позиционирование в файловых потоках
Реализующие доступ к обычным файлам потоки на основе класса SCFileStream поддерживают позиционирование, то есть изменение положения указателя следующей операции чтения или записи.
Класс SCFileStream содержит следующие методы позиционирования в файловых потоках:
- (BOOL)eof;
- (void)setOffset:(NSInteger)offset;
- (NSInteger)offset;
- (void)rewind;
- Свойство eof возвращает значение YES если указатель установлен в конце потока.
- Метод setOffset:whence: передвигает указатель на указанное количество символов по отношению к заданному направлению смещения.
- Метод setOffset: перемещает указатель на заданное количество символов от начала потока.
- Метод offset возвращает текущую позицию указателя в виде количества символов от начала потока.
- Метод rewind устанавливает указатель в начало потока.
При использовании для позиционирования метода setOffset:whence: в качестве второго аргумента передается направление позиционирования, которое определяется типом SCFileStreamOffsetWhence, содержащим следующие константы:
Методы протокола делегирования SCStreamDelegate
Класс SCFileStream дополняет протокол делегирования SCStreamDelegate методами, которые реагируют на такие события, как открытие и закрытие файловых потоков.
Стандартные потоки ввода-вывода
В состав библиотеки входят три дочерних класса потоков для предоставления программистам доступа к стандартным потокам ввода и вывода:
Все три вышеуказанных класса являются потомками класса SCStream. В последующих разделах каждый из классов описывается более подробно.
Стандартный поток ввода SCStandardInputStream
Класс SCStandardInputStream предоставляет программистам доступ к стандартному потоку ввода stdin. Данный поток обеспечивает только операции чтения.
Для обеспечения доступа к данному потоку в классе объявлены следующие методы:
+ (instancetype)stdinStream;
- Классовый метод stdinStreamWithDelegate: возвращает указатель на стандартный поток ввода с заданным объектом делегирования.
- Классовый метод stdinStream возвращает указатель на стандартный поток ввода без назначения объекта делегирования.
Обращаем внимание, что оба вышеупомянутых метода всегда возвращают указатель на один и тот же поток - это связано с тем, что стандартный поток ввода stdin в операционной системе существует в единственном экземпляре. К тому же существование нескольких экземпляров класса потенциально может привести к коллизиям, особенно если эти несколько объектов были созданы в различных нитях процесса.
Ниже приводится пример использования стандартного потока ввода:
while ( !input.eof) {
if ( string) NSLog( @"%@", string);
}
Sample input string
2016-07-08 00:54:46.809 libtest[17772:4042392] Sample input string
Request for proposal
2016-07-08 00:54:54.691 libtest[17772:4042392] Request for proposal
Last entered string
2016-07-08 00:55:01.249 libtest[17772:4042392] Last entered string
Стандартный поток вывода SCStandardOutputStream
Класс SCStandardOutputStream предоставляет программистам доступ к стандартному потоку вывода stdout. Данный поток обеспечивает только операции записи.
Для обеспечения доступа к данному потоку в классе объявлены следующие методы:
+ (instancetype)stdoutStream;
- Классовый метод stdoutStreamWithDelegate: возвращает указатель на стандартный поток вывода с заданным объектом делегирования.
- Классовый метод stdoutStream возвращает указатель на стандартный поток вывода без назначения объекта делегирования.
Обращаем внимание, что оба вышеупомянутых метода всегда возвращают указатель на один и тот же поток - это связано с тем, что стандартный поток вывода stdout в операционной системе существует в единственном экземпляре. К тому же существование нескольких экземпляров класса потенциально может привести к коллизиям, особенно если эти несколько объектов были созданы в различных нитях процесса.
Ниже приводится пример использования стандартного потока вывода:
Sample output string
This is a test string
Last output string
Поток стандартной ошибки SCStandardErrorStream
Класс SCStandardErrorStream предоставляет программистам доступ к стандартному потоку ошибок stderr. Данный поток обеспечивает только операции записи.
Для обеспечения доступа к данному потоку в классе объявлены следующие методы:
+ (instancetype)stderrStream;
- Классовый метод stderrStreamWithDelegate: возвращает указатель на стандартный поток ошибок с заданным объектом делегирования.
- Классовый метод stderrStream возвращает указатель на стандартный поток ошибок без назначения объекта делегирования.
Обращаем внимание, что оба вышеупомянутых метода всегда возвращают указатель на один и тот же поток - это связано с тем, что стандартный поток ошибок stderr в операционной системе существует в единственном экземпляре. К тому же существование нескольких экземпляров класса потенциально может привести к коллизиям, особенно если эти несколько объектов были созданы в различных нитях процесса.
Ниже приводится пример использования стандартного потока ошибок:
System error: 2319
Application error: 2315
Fatal falture
Нулевой поток SCNullStream
Класс SCNullStream является потомком класса SCStream и предоставляет доступ к системному устройству /dev/null. Данный поток обеспечивает только операции записи. Основное назначение нулевого потока - возможность записи в него неограниченного количества данных (все передаваемые в поток данные уничтожаются).
Для обеспечения доступа к данному потоку в классе объявлены следующие методы:
+ (instancetype)nullStream;
- Классовый метод nullStreamWithDelegate: возвращает указатель на нулевой поток с заданным объектом делегирования.
- Классовый метод nullStream возвращает указатель на нулевой поток без назначения объекта делегирования.
Обращаем внимание, что оба вышеупомянутых метода всегда возвращают указатель на один и тот же поток - это связано с тем, что нулевой поток /dev/null в операционной системе существует в единственном экземпляре. К тому же существование нескольких экземпляров класса потенциально может привести к коллизиям, особенно если эти несколько объектов были созданы в различных нитях процесса.
Коллекции
Коллекции представляют собой экземпляры классов, которые являются контейнерами для экземпляров других классов. Типичным примером коллекций являются массивы экземпляров класса. В состав библиотеки входят два вида коллекций:
- коллекции библиотеки, представляющие собой иерархию классов на основе родительского класса SCCollection:
- категории, расширяющие функционал стандартных классов Objective-C:
Коллекции библиотеки взаимодействуют с обрабатываемыми экземплярами классов через методы протокола SCCollectioning.
Иерархия классов коллекций
Класс SCCollection является абстрактным классом, поскольку не содержит реального механизма хранения данных, которые реализуются в дочерних классах в соответствии с их назначением. В то же время класс SCCollection группирует в себе общие для всех классов коллекций методы, которые перекрываются в дочерних классах.
Виды классов коллекций
В целях упорядочения распределения различного функционала классов коллекций, а также для более простого добавления в стандартные классы совместимого с нашим функционала, нами был разработан ряд протоколов, соответствие которым и определяет совместимость с нашим механизмом коллекций. К таким протоколам относятся:
В следующих параграфах данные протоколы будут рассмотрены более подробно.
Протокол SCCollection
Данный протокол определяет список свойств и методов, которые должны быть реализованы в классе или категории, чтобы соответствующий класс мог обеспечивать функциональность контейнеров экземпляров классов без внесения в них изменений. Все классы коллекций соответствуют данному протоколу. Также этому протоколу соответствуют категории, расширяющие функциональность следующих стандартных классов:
Протокол объявляет следующие обязательные для реализации свойства:
@property (nonatomic, assign, readonly, getter=count)
SCIndex count;
@property (nonatomic, assign, readonly, getter=empty) BOOL empty;
Классы и категории коллекций должны поддерживать следующие методы инициализации:
- (instancetype)initWithCollection:(
id<
SCCollection>)collection;
Обязательным для всех коллекций является реализация следующих методов доступа к свойствам коллекций:
Протокол требует реализации следующих методов поиска данных:
- (BOOL)containsAnyObjectFromCollection:(
id<
SCCollection>)collection;
Для обеспечения свободного преобразования одних типов коллекций в другие протокол SCCollection обязует программистов реализовать следующие методы:
- (NSArray *)foundationArray;
- (NSSet *)foundationSet;
- (NSOrderedSet *)foundationOrderedSet;
- (NSDictionary *)foundationDictionary;
Чтобы другие компоненты библиотеки могли определять типы коллекций, протокол требует реализации следующих методов определения типов коллекций:
- (BOOL)isCollection;
- (BOOL)isLibraryCollection;
- (BOOL)isFoundationCollection;
- (BOOL)isArray;
- (BOOL)isLibraryArray;
- (BOOL)isFoundationArray;
- (BOOL)isSet;
- (BOOL)isLibrarySet;
- (BOOL)isFoundationSet;
- (BOOL)isOrderedSet;
- (BOOL)isLibraryOrderedSet;
- (BOOL)isFoundationOrderedSet;
- (BOOL)isDictionary;
- (BOOL)isLibraryDictionary;
- (BOOL)isFoundationDictionary;
- (BOOL)isStack;
- (BOOL)isQueue;
- (BOOL)isList;
- (BOOL)isSortable;
Также протокол объявляет необязательные методы поддержки счетчиков объектов коллекций:
- (NSEnumerator *)objectEnumerator;
- (NSEnumerator *)reverseObjectEnumerator;
Описание вышеперечисленных свойств и методов приводится в соответствующих разделах руководства программиста.
Протокол SCMutableCollection
Протокол SCMutableCollection расширяет протокол SCCollection, декларируя методы, которые должны быть реализованы в коллекциях, которые разрешают изменение своего содержимого. Все классы коллекций библиотеки соответствуют данному протоколу. Также этому протоколу соответствуют категории, которые расширяют функциональность стандартных классов:
Протокол требует обязательной реализации следующих методов копирования коллекций:
В соответствии с протоколом обязательно должны быть реализованы методы добавления объектов:
Также протокол требует реализации следующих методов удаления объектов из коллекций:
- (void)removeAllObjects;
- (void)removeObjectsWithClass:(Class)oclass;
- (void)removeObjectsWithClassName:(NSString *)name;
Описание вышеперечисленных методов приводится в соответствующих разделах данного руководства.
Протокол SCIndexedCollection
Протокол объявляет методы, которые должны поддерживать индексируемые коллекции, то есть коллекции, обеспечивающие доступ к объектам с помощью индексов. Методы протокола SCIndexedCollection не вносят каких-либо изменений в содержимое коллекций. Данному протоколу соответствуют следующие классы библиотеки:
Также данному протоколу соответствуют следующие категории, расширяющие функционал стандартных классов:
Протокол декларирует следующие обязательные методы для доступа к объектам индексированных коллекций:
- (id)firstObject;
- (id)lastObject;
- (id)objectAtIndex:(
SCIndex)index;
Также протокол требует реализации следующих методов поиска объектов:
Описание вышеуказанных методов находится в соответствующих разделах данного руководства.
Протокол SCMutableIndexedCollection
Протокол SCMutableCollection объявляет методы, которые могут вносить изменения в индексируемые коллекции. К таким коллекциям относятся следующие классы:
Также данному протоколу соответствуют следующие категории, расширяющие функционал стандартных классов:
Протокол объявляет следующие обязательные методы:
- (void)removeObjectAtIndex:(
SCIndex)index;
- (void)removeObjectsAtIndexes:(NSIndexSet *)indexes;
Описание данных методов приводится в соответствующих разделах руководства программиста.
Свойства коллекций
Класс SCCollection и все его потомки объявляют следующие свойства:
@property (nonatomic, assign, readonly, getter=count)
SCIndex count;
@property (nonatomic, assign, readonly, getter=empty) BOOL empty;
@property (nonatomic, retain, getter=name, setter=setName:) NSString *name;
@property (nonatomic, assign, getter=readOnly, setter=setReadOnly:) BOOL readOnly;
@property (nonatomic, assign, getter=delegate, setter=setDelegate:) id<SCCollectionDelegate> delegate;
@property (nonatomic, retain, readonly, getter=typeName) NSString *typeName;
- Свойство count (только для чтения) возвращает количество объектов в коллекции.
- Свойство empty (только для чтения) возвращает значение YES в случае отсутствия в коллекции объектов (пустая коллекция) и NO при наличии в коллекции хотя бы одного объекта.
- Свойство name определяет имя коллекции.
- Свойство readOnly определяет, возможно ли внесение изменений в данной коллекции. Значение данного свойства может быть изменено программным способом.
- Свойство delegate позволяет определить объект делегирования коллекции. Объекты делегирования подробно описаны в разделе Протокол делегирования SCCollectionDelegate.
- Свойство typeName (только для чтения) возвращает название типа коллекции.
Копирование коллекций
Методы копирования удаляют текущее содержимое существующей коллекции и вместо него помещает содержимое переданной коллекции или другого объекта. Класс SCCollection объявляет следующие методы копирования:
- Метод setCollection: заменяет текущее содержимое коллекции на содержимое коллекции, указанной в качестве аргумента метода. Приведем пример использования метода на примере класса SCArray:
[existingArray addObject:@"String 00"];
[existingArray addObject:@"String 01"];
[existingArray addObject:@"String 02"];
[source addObject:@"String 10"];
[source addObject:@"String 10"];
[source addObject:@"String 10"];
NSLog( @"%@", existingArray);
NSLog( @"%@", existingArray);
2016-07-11 01:25:17.215 libtest[22320:5173906] Array count=3: (
"String 00",
"String 01",
"String 02"
)
2016-07-11 01:25:17.216 libtest[22320:5173906] Array count=3: (
"String 10",
"String 10",
"String 10"
)
- Метод setObject: заменяет текущее содержимое коллекции на указанный объект:
[existingArray addObject:@"String 00"];
[existingArray addObject:@"String 01"];
[existingArray addObject:@"String 02"];
NSLog( @"%@", existingArray);
NSLog( @"%@", existingArray);
2016-07-11 01:43:46.979 libtest[22417:5184286] Array count=3: (
"String 00",
"String 01",
"String 02"
)
2016-07-11 01:43:46.980 libtest[22417:5184286] Array count=1: (
"String 10"
)
- Метод setObjects: заменяет текущее содержимое коллекции на завершаемый нулевым указателем список объектов:
[existingArray addObject:@"String 00"];
[existingArray addObject:@"String 01"];
[existingArray addObject:@"String 02"];
NSLog( @"%@", existingArray);
[existingArray
setObjects:@"String 10", @"String 11", nil];
NSLog( @"%@", existingArray);
2016-07-11 01:46:38.537 libtest[22456:5186176] Array count=3: (
"String 00",
"String 01",
"String 02"
)
2016-07-11 01:46:38.537 libtest[22456:5186176] Array count=2: (
"String 10",
"String 11"
)
Если коллекция находится в режиме только для чтения (свойство readOnly установлено в значение YES), коллекция генерирует ошибку SCL-20043.
Сравнение коллекций
Класс SCCollection объявляет ряд методов, которые выполняют сравнение коллекции с другими коллекциями:
- (BOOL)isEqualToContentsOfCollection:(
id<
SCCollection>)collection;
- (BOOL)isEqual:(id)object;
- Метод isEqualToCollection: выполняет полное сравнение коллекций, то есть сравниваются не только объекты обеих коллекций, но и их параметры, например, имена коллекций:
[array addObject:@"String 00"];
[array addObject:@"String 01"];
[array addObject:@"String 02"];
[collection addObject:@"String 00"];
[collection addObject:@"String 01"];
NSLog( @"%d", [array isEqualToCollection:collection]);
[collection addObject:@"String 02"];
NSLog( @"%d", [array isEqualToCollection:collection]);
collection.
name =
@"sampleArray";
NSLog( @"%d", [array isEqualToCollection:collection]);
2016-07-11 04:54:17.394 libtest[23498:5691307] 0
2016-07-11 04:54:17.394 libtest[23498:5691307] 0
2016-07-11 04:54:17.394 libtest[23498:5691307] 1
- Метод isEqualToContentsOfCollection: выполняет сравнение содержимого двух коллекций без учета их параметров:
[array addObject:@"String 00"];
[array addObject:@"String 01"];
[array addObject:@"String 02"];
[collection addObject:@"String 00"];
[collection addObject:@"String 01"];
NSLog( @"%d", [array isEqualToContentsOfCollection:collection]);
[collection addObject:@"String 02"];
NSLog( @"%d", [array isEqualToContentsOfCollection:collection]);
collection.
name =
@"sampleArray";
NSLog( @"%d", [array isEqualToContentsOfCollection:collection]);
2016-07-11 05:04:58.792 libtest[23602:5698937] 0
2016-07-11 05:04:58.793 libtest[23602:5698937] 1
2016-07-11 05:04:58.793 libtest[23602:5698937] 1
- Метод isEqual: аналогичен методу isEqualToCollection: в случае, если в качестве аргумента передан указатель на коллекцию, если же передан указатель на экземпляр любого другого класса, то метод возвращает значение NO без выполнения сравнения.
Перечисление коллекций
В состав класса SCCollection входят свойства и методы, обеспечивающие перечисление объектов коллекции:
- (NSEnumerator *)objectEnumerator;
- (NSEnumerator *)reverseObjectEnumerator;
- (void)enumerate;
- (void)reverseEnumerate;
- Свойство objectEnumerator возвращает объект класса NSEnumerator, через который программист получает доступ ко всем объектам коллекции, начиная с первого:
[array addObject:@"String 00"];
[array addObject:@"String 01"];
[array addObject:@"String 02"];
NSEnumerator *enumerator = [array objectEnumerator];
id object;
while ( ( object = enumerator.nextObject)) NSLog( @"%@", object);
2016-07-11 05:17:03.098 libtest[23759:5708985] String 00
2016-07-11 05:17:03.099 libtest[23759:5708985] String 01
2016-07-11 05:17:03.099 libtest[23759:5708985] String 02
- Метод reverseObjectEnumerator аналогичен свойству objectEnumerator, только объект класса NSEnumerator перечисляет объекты коллекции в обратном порядке, то есть от последнего к первому:
[array addObject:@"String 00"];
[array addObject:@"String 01"];
[array addObject:@"String 02"];
NSEnumerator *enumerator = [array reverseObjectEnumerator];
id object;
while ( ( object = enumerator.nextObject)) NSLog( @"%@", object);
2016-07-11 05:36:59.934 libtest[23872:5720807] String 02
2016-07-11 05:36:59.934 libtest[23872:5720807] String 01
2016-07-11 05:36:59.934 libtest[23872:5720807] String 00
- Методы enumerateWithDelegate: и enumerate для каждого объекта коллекции, начиная с первого, вызывают метод processObject:collection: объекта делегирования, соответствующего протоколу SCCollectionDelegate. Отличие этих двух методов состоит в том, что при использовании метода enumerateWithDelegate: применяется указанный в качестве аргумента метода объект делегирования, тогда как при использовании метода enumerate используется объект делегирования, заданный свойством delegate. Если объект делегирования не задан, то обработка объектов коллекции не производится:
@end
@implementation SCTestDelegate
- (void)processObject:(
id)object collection:(
SCCollection *)collection {
NSLog( @"Process item \"%@\"", object);
}
@end
SCTestDelegate *delegate = [[[SCTestDelegate alloc] init] autorelease];
[array addObject:@"String 00"];
[array addObject:@"String 01"];
[array addObject:@"String 02"];
2016-07-11 05:57:51.828 libtest[24125:5734820] Process item "String 00"
2016-07-11 05:57:51.828 libtest[24125:5734820] Process item "String 01"
2016-07-11 05:57:51.828 libtest[24125:5734820] Process item "String 02"
Преобразование коллекций
Класс SCCollection декларирует ряд свойств, которые отвечают за преобразование экземпляров одного класса коллекций в экземпляр другого класса коллекций:
- (NSArray *)foundationArray;
- (NSSet *)foundationSet;
- (NSOrderedSet *)foundationOrderedSet;
- (NSDictionary *)foundationDictionary;
Добавление объектов
Класс SCCollection объявляет следующие основные методы добавления объектов в состав коллекции:
- Метод addObject: осуществляет добавление в коллекцию указанного объекта:
[array addObject:@"String 00"];
NSLog( @"%@", array);
[array addObject:@"New string"];
NSLog( @"%@", array);
2016-07-12 09:07:15.947 libtest[26117:6591434] Array count=1: (
"String 00"
)
2016-07-12 09:07:15.947 libtest[26117:6591434] Array count=2: (
"String 00",
"New string"
)
- Метод addObjects: добавляет в коллекцию объекты из завершаемого нулевым указателем списка:
[array addObject:@"String 00"];
NSLog( @"%@", array);
[array
addObjects:@"New string", @"Test string", nil];
NSLog( @"%@", array);
2016-07-12 09:11:44.393 libtest[26183:6593841] Array count=1: (
"String 00"
)
2016-07-12 09:11:44.393 libtest[26183:6593841] Array count=3: (
"String 00",
"New string",
"Test string"
)
- Метод addCollection: добавляет в коллекцию все объекты из указананной в качестве аргумента коллекции:
[array addObject:@"String 00"];
[source addObject:@"String 10"];
[source addObject:@"String 11"];
NSLog( @"%@", array);
NSLog( @"%@", array);
2016-07-12 09:22:11.744 libtest[26243:6597746] Array count=1: (
"String 00"
)
2016-07-12 09:22:11.744 libtest[26243:6597746] Array count=3: (
"String 00",
"String 10",
"String 11"
)
Если вышеперечисленные методы вызываются для находящейся в режиме только для чтения коллекции, то механизм коллекций генерирует исключительную ситуацию SCL-20043.
Удаление объектов
Класс SCCollection объявляет следующие методы удаления объектов из коллекции:
- (void)removeAllObjects;
- (void)removeObjectsWithClass:(Class)oclass;
- (void)removeObjectsWithClassName:(NSString *)name;
- Метод removeAllObjects удаляет из коллекции все присутствующие в ней объекты:
[array addObject:@"String 00"];
[array addObject:@"String 01"];
[array addObject:@"String 02"];
NSLog( @"%@", array);
[array removeAllObjects];
NSLog( @"%@", array);
2016-07-12 10:01:29.533 libtest[26411:6622066] Array count=3: (
"String 00",
"String 01",
"String 02"
)
2016-07-12 10:01:29.533 libtest[26411:6622066] Array count=0:
)
- Метод removeObjectsWithClass: осуществляет удаление из коллекции экземпляров указанного класса:
[array addObject:@"String 00"];
[array addInteger:1909];
[array addInteger:1975];
[array addObject:@"String 01"];
NSLog( @"%@", array);
[array removeObjectsWithClass:[NSNumber class]];
NSLog( @"%@", array);
2016-07-12 10:04:35.671 libtest[26447:6624285] Array count=4: (
"String 00",
"1909",
"1975",
"String 01"
)
2016-07-12 10:04:35.671 libtest[26447:6624285] Array count=2: (
"String 00",
"String 01"
)
- Метод removeObjectsWithClassName: действует аналогично предыдущему, но вместо непосредственно класса удаляемых объектов в качестве аргмунета принимает название класса, экземпляры которого должны быть удалены из коллекции:
[array addObject:@"String 00"];
[array addInteger:1909];
[array addInteger:1975];
[array addObject:@"String 01"];
NSLog( @"%@", array);
NSLog( @"%@", array);
2016-07-12 10:06:14.012 libtest[26474:6625250] Array count=4: (
"String 00",
"1909",
"1975",
"String 01"
)
2016-07-12 10:06:14.012 libtest[26474:6625250] Array count=2: (
"1909",
"1975"
)
- Метод removeCollection: удаляет из коллекции объекты, присутствующие в указанной в качестве аргумента коллекции:
[array addObject:@"String 00"];
[array addObject:@"String 01"];
[array addObject:@"String 02"];
NSLog( @"%@", array);
NSLog( @"%@", array);
2016-07-12 10:09:16.356 libtest[26516:6627087] Array count=3: (
"String 00",
"String 01",
"String 02"
)
2016-07-12 10:09:16.357 libtest[26516:6627087] Array count=1: (
"String 00"
)
- Метод removeObject: удаляет из коллекции указанный объект:
[array addObject:@"String 00"];
[array addObject:@"String 01"];
[array addObject:@"String 02"];
NSLog( @"%@", array);
[array removeObject:@"String 01"];
[array removeObject:@"String 11"];
NSLog( @"%@", array);
2016-07-12 10:10:45.943 libtest[26541:6628329] Array count=3: (
"String 00",
"String 01",
"String 02"
)
2016-07-12 10:10:45.943 libtest[26541:6628329] Array count=2: (
"String 00",
"String 02"
)
- Метод removeObjects: удаляет из коллекции объекты из переданного методу в качестве аргумента завершаемого нулевым указателем списка:
[array addObject:@"String 00"];
[array addObject:@"String 01"];
[array addObject:@"String 02"];
NSLog( @"%@", array);
[array
removeObjects:@"String 01", @"String 00", @"String 11", nil];
NSLog( @"%@", array);
2016-07-12 10:12:11.710 libtest[26565:6629231] Array count=3: (
"String 00",
"String 01",
"String 02"
)
2016-07-12 10:12:11.710 libtest[26565:6629231] Array count=1: (
"String 02"
)
Если методы удаления вызываются для коллекции, которая находится в режиме только для чтения, то генерируется исключительная ситуация SCL-20043.
Поиск элементов коллекции
Методы поиска определяют наличие в коллекции указанных в качестве аргумента объектов. Класс SCCollection объявляет следующие методы поиска объектов:
- (BOOL)containsAnyObjectFromCollection:(
id<
SCCollection>)collection;
- Метод containsObject: возвращает YES при наличии в коллекции указанного объекта и NO в противном случае:
[array addObject:@"String 00"];
[array addObject:@"String 01"];
[array addObject:@"String 02"];
NSLog( @"%d", [array containsObject:@"String 01"]);
NSLog( @"%d", [array containsObject:@"String 11"]);
2016-07-11 02:06:28.303 libtest[22651:5200484] 1
2016-07-11 02:06:28.303 libtest[22651:5200484] 0
- Метод containsObjects: возвращает YES при наличии в коллекции всех объектов из указанного завершаемого нулевым указателем списка объектов. Если хотя бы один из объектов списка отсутствует в коллекции, метод возвращает NO:
[array addObject:@"String 00"];
[array addObject:@"String 01"];
[array addObject:@"String 02"];
NSLog( @"%d", [array containsObjects:@"String 00", @"String 02"]);
NSLog( @"%d", [array containsObjects:@"String 00", @"String 12"]);
NSLog( @"%d", [array containsObjects:@"String 10", @"String 12"]);
2016-07-11 03:29:18.947 libtest[22819:5227995] 1
2016-07-11 03:29:18.947 libtest[22819:5227995] 0
2016-07-11 03:29:18.947 libtest[22819:5227995] 0
- Метод containsCollection: возвращает значение YES в том случае, если коллекция содержит все объекты из указанной коллекции. При отсутствии хотя бы одного из объектов возвращается NO в качестве значения:
[array addObject:@"String 00"];
[array addObject:@"String 01"];
[array addObject:@"String 02"];
NSLog(
@"%d", [array containsCollection:[
SCArray arrayWithObjects:
@"String 00",
@"String 02", nil]]);
NSLog(
@"%d", [array containsCollection:[
SCArray arrayWithObjects:
@"String 00",
@"String 12", nil]]);
NSLog(
@"%d", [array containsCollection:[
SCArray arrayWithObjects:
@"String 10",
@"String 12", nil]]);
2016-07-11 03:48:33.555 libtest[23105:5394701] 1
2016-07-11 03:48:33.556 libtest[23105:5394701] 0
2016-07-11 03:48:33.556 libtest[23105:5394701] 0
- Метод containsAnyObject: определяет наличие в коллекции хотя бы одного объекта из завершаемого нулевым указателем списка объектов. Если хотя бы один объект присутствует в коллекции, метод возвращает значение YES. Значение NO возвращается в случае, когда в коллекции нет ни одного объекта из списка:
[array addObject:@"String 00"];
[array addObject:@"String 01"];
[array addObject:@"String 02"];
NSLog( @"%d", [array containsAnyObject:@"String 00", @"String 02", nil]);
NSLog( @"%d", [array containsAnyObject:@"String 00", @"String 12", nil]);
NSLog( @"%d", [array containsAnyObject:@"String 10", @"String 12", nil]);
2016-07-11 04:18:22.893 libtest[23264:5650221] 1
2016-07-11 04:18:22.893 libtest[23264:5650221] 1
2016-07-11 04:18:22.893 libtest[23264:5650221] 0
- Метод containsAnyObjectFromCollection: определяет наличие в коллекции хотя бы одного объекта из указанной коллекции. Он возвращает YES при наличии такового объекта и NO в противном случае:
[array addObject:@"String 00"];
[array addObject:@"String 01"];
[array addObject:@"String 02"];
NSLog(
@"%d", [array containsAnyObjectFromCollection:[
SCArray arrayWithObjects:
@"String 00",
@"String 02", nil]]);
NSLog(
@"%d", [array containsAnyObjectFromCollection:[
SCArray arrayWithObjects:
@"String 00",
@"String 12", nil]]);
NSLog(
@"%d", [array containsAnyObjectFromCollection:[
SCArray arrayWithObjects:
@"String 10",
@"String 12", nil]]);
2016-07-11 04:25:44.907 libtest[23333:5677089] 1
2016-07-11 04:25:44.907 libtest[23333:5677089] 1
2016-07-11 04:25:44.907 libtest[23333:5677089] 0
Определение типов коллекций
Класс SCCollection объявляет методы, позволяющие программистам определить, к какому типу коллекции относится конкретный экземпляр класса:
- (BOOL)isCollection;
- (BOOL)isLibraryCollection;
- (BOOL)isFoundationCollection;
- (BOOL)isArray;
- (BOOL)isLibraryArray;
- (BOOL)isFoundationArray;
- (BOOL)isSet;
- (BOOL)isLibrarySet;
- (BOOL)isFoundationSet;
- (BOOL)isOrderedSet;
- (BOOL)isLibraryOrderedSet;
- (BOOL)isFoundationOrderedSet;
- (BOOL)isDictionary;
- (BOOL)isLibraryDictionary;
- (BOOL)isFoundationDictionary;
- (BOOL)isStack;
- (BOOL)isQueue;
- (BOOL)isList;
- (BOOL)isSortable;
- Метод isCollection возвращает значение YES в том случае, если экземпляр класса относится к любому типу коллекции.
- Метод isLibraryCollection возвращает YES в случае, если данный экземпляр класса относится к библиотечным коллекциям (SCArray, SCSet, SCOrderedSet, SCDictionary, SCStack, SCQueues, SCUnidirectionalLists и SCBidirectionalList).
- Метод isFoundationCollection возвращает значение YES, если экземпляр класса относится к стандартным коллекциям (NSArray, NSMutableArray, NSSet, NSMutableSet, NSOrderedSet, NSMutableOrderedSet, NSDictionary и NSMutableDictionary).
- Метод isSet возвращает YES если экземпляр класса принадлежит к упорядоченным множествам (классы SCSet, NSSet и NSMutableSet).
- Метод isLibrarySet возвращает значение YES в том случае, если данный экземпляр относится к классу библиотечных неупорядоченных множеств (SCSet).
- Метод isFoundationSet возвращает YES для экземпляров класса, относящихся к стандартным неупорядоченным множествам (классы NSSet и NSMutableSet).
Кроме методов экземпляров класса SCCollection объявляет классовые методы, позволяющие определить тип коллекции переданного экземпляра класса:
+ (BOOL)isCollection:(id)object;
+ (BOOL)isLibraryCollection:(id)object;
+ (BOOL)isFoundationCollection:(id)object;
+ (BOOL)isArray:(id)object;
+ (BOOL)isLibraryArray:(id)object;
+ (BOOL)isFoundationArray:(id)object;
+ (BOOL)isSet:(id)object;
+ (BOOL)isLibrarySet:(id)object;
+ (BOOL)isFoundationSet:(id)object;
+ (BOOL)isOrderedSet:(id)object;
+ (BOOL)isLibraryOrderedSet:(id)object;
+ (BOOL)isFoundationOrderedSet:(id)object;
+ (BOOL)isDictionary:(id)object;
+ (BOOL)isLibraryDictionary:(id)object;
+ (BOOL)isFoundationDictionary:(id)object;
+ (BOOL)isStack:(id)object;
+ (BOOL)isQueue:(id)object;
+ (BOOL)isList:(id)object;
+ (BOOL)isSortable:(id)object;
Также класс SCCollection объявляет ряд классовых методов, которые определяют принадлежность к тому или иному типу коллекции класса с указанным именем:
+ (BOOL)isCollectionClass:(NSString *)name;
+ (BOOL)isLibraryCollectionClass:(NSString *)name;
+ (BOOL)isFoundationCollectionClass:(NSString *)name;
+ (BOOL)isArrayClass:(NSString *)name;
+ (BOOL)isLibraryArrayClass:(NSString *)name;
+ (BOOL)isFoundationArrayClass:(NSString *)name;
+ (BOOL)isSetClass:(NSString *)name;
+ (BOOL)isLibrarySetClass:(NSString *)name;
+ (BOOL)isFoundationSetClass:(NSString *)name;
+ (BOOL)isOrderedSetClass:(NSString *)name;
+ (BOOL)isLibraryOrderedSetClass:(NSString *)name;
+ (BOOL)isFoundationOrderedSetClass:(NSString *)name;
+ (BOOL)isDictionaryClass:(NSString *)name;
+ (BOOL)isLibraryDictionaryClass:(NSString *)name;
+ (BOOL)isFoundationDictionaryClass:(NSString *)name;
+ (BOOL)isStackClass:(NSString *)name;
+ (BOOL)isQueueClass:(NSString *)name;
+ (BOOL)isListClass:(NSString *)name;
+ (BOOL)isSortableClass:(NSString *)name;
Массивы
Массивы - разновидность коллекций, которая обеспечивает доступ к отдельным объектам массива с помощью индексации, то есть с указанием номера (индекса) нужного объекта. Благодаря этому массивы являются коллекциями с произвольным доступом. Массивы также являются сортируемыми коллекциями.
В библиотеке функции массивов реализует класс SCArray. Экземпляры класса могут поддерживать как доступ к данным массива, так и внесение изменений в массивы.
Создание массивов
Для создания массивов из последовательных файлов, словарей и потоков используются методы из следующего списка:
+ (instancetype)arrayWithCoder:(NSCoder *)coder;
+ (instancetype)arrayWithContentsOfSerializedFile:(NSString *)path;
+ (instancetype)arrayWithDataDictionary:(NSDictionary *)dictionary;
+ (instancetype)arrayWithDataDictionaryFromFile:(NSString *)path;
+ (instancetype)arrayWithStream:(
SCStream *)stream;
+ (instancetype)arrayWithFileStream:(NSString *)path;
Создание массивов может быть выполнено с помощью следующих классовых методов:
+ (instancetype)arrayWithName:(NSString *)name;
+ (instancetype)arrayWithCollection:(
id<
SCCollection>)collection;
+ (instancetype)arrayWithArray:(
SCArray *)array;
+ (instancetype)array;
- Метод arrayWithName: возвращает пустой массив с указанным в качестве аргумента именем массива:
NSLog( @"%@", array);
NSLog(
@"Array name: %@", array.
name);
2016-07-21 13:13:14.395 libtest[4044:837368] Array "UsersList" count=0:
)
2016-07-21 13:13:14.395 libtest[4044:837368] Array name: UsersList
- Метод arrayWithObject: создает и возвращает массив с указанным объектом в качестве единственного элемента:
2016-07-21 13:16:42.819 libtest[4100:840315] Array count=1: (
"Sample string"
)
- Метод arrayWithObjects: создает массив, который содержит объекты из указанного в качестве аргумента метода завершаемого нулевым указателем списка:
2016-07-21 13:26:10.353 libtest[4168:845565] Array count=3: (
"String 00",
"String 01",
"String 02"
)
- Метод arrayWithCollection: создает и возвращает массив, который содержит объекты из исходной коллекции любого поддерживаемого библиотекой типа:
NSSet *source = [NSSet setWithObjects:@"Code 10", @"Code 20", @"Code 30", nil];
NSLog( @"%@", array);
2016-07-21 13:27:56.528 libtest[4195:846841] Array count=3: (
"Code 10",
"Code 20",
"Code 30"
)
- Метод arrayWithArray: возвращает копию переданного в качестве аргумента метода существующего массива:
2016-07-21 13:32:11.010 libtest[4232:850227] Array count=3: (
"Object 00",
"Object 10",
"Object 20"
)
- Метод array возвращает пустой неименованный массив:
2016-07-21 13:35:23.386 libtest[4280:853760] Array count=0:
)
Инициализация массивов
Класс SCArray объявляет следующие методы инициализации массивов:
- (instancetype)initWithName:(NSString *)name;
- (instancetype)initWithCollection:(
id<
SCCollection>)collection;
- (instancetype)initWithArray:(
SCArray *)array;
- (instancetype)init;
- Метод initWithName: инициализирует массив с присваиванием ему указанного в качестве аргумента метода имени (см. свойство name).
- Метод initWithObject: инициализирует неименованный массив и добавляет в качестве единственного элемента указанный объект.
- Метод initWithObjects: осуществляет инициализацию неименнованного массива и добавляет в инициализированный массив объекты из указанного завершаемого нулевым указателем списка.
- Метод initWithCollection: инициализирует массив с использованием параметров и содержимого указанной существующей коллекции любого поддерживаемого библиотекой типа.
- Метод initWithArray: инициализирует копию указанного существующего массива.
- Метод init инициализирует пустой неименованный массив.
Копирование массивов
Копирование массивов осуществляется следующими методами класса SCArray:
- Метод setArray: уничтожает текущее содержимое массива и копирует параметры и объекты из указанного исходного массива. При попытке копирования в находящийся в режиме только для чтения массив возникает ошибка SCL-20043:
NSLog( @"%@", array);
NSLog( @"%@", array);
2016-07-21 14:58:21.653 libtest[4698:910061] Array count=3: (
"String 00",
"String 10",
"String 20"
)
2016-07-21 14:58:21.653 libtest[4698:910061] Array count=3: (
"Object 00",
"Object 01",
"Object 02"
)
Сравнение массивов
Класс SCArray дополняет класс SCCollection следующими методами сравнения экземпляров класса:
- (BOOL)isEqualToArray:(
SCArray *)array;
- (BOOL)isEqualToContentsOfArray:(
SCArray *)array;
- Метод isEqualToArray: сравнивает исходный массив с заданным массивом и возвращает значение YES при одинаковом содержимом двух массивов и при одинаковых параметрах массивов.
- Метод isEqualToContentsOfArray: выполняет сравнение содержимого исходного массива с содержимым указанного массива и возвращает значение YES в случае, если содержимое обоих массивов одинаково.
[array addObject:@"Line 00"];
[array addObject:@"Line 01"];
[array addObject:@"Line 02"];
[source addObject:@"Line 00"];
[source addObject:@"Line 01"];
[source addObject:@"Line 02"];
[sample addObject:@"Line 00"];
[sample addObject:@"Line 10"];
[sample addObject:@"Line 20"];
NSLog( @"[array isEqualToArray:source] = %d", [array isEqualToArray:source]);
NSLog( @"[array isEqualToArray:sample] = %d", [array isEqualToArray:sample]);
NSLog( @"==================================");
NSLog( @"[array isEqualToContentsOfArray:source] = %d", [array isEqualToContentsOfArray:source]);
NSLog( @"[array isEqualToContentsOfArray:sample] = %d", [array isEqualToContentsOfArray:sample]);
2016-07-25 01:36:51.081 libtest[11081:1745880] [array isEqualToArray:source] = 0
2016-07-25 01:36:51.081 libtest[11081:1745880] [array isEqualToArray:sample] = 0
2016-07-25 01:36:51.081 libtest[11081:1745880] ==================================
2016-07-25 01:36:51.081 libtest[11081:1745880] [array isEqualToContentsOfArray:source] = 1
2016-07-25 01:36:51.081 libtest[11081:1745880] [array isEqualToContentsOfArray:sample] = 0
Сортировка массивов
Массивы, как и любые коллекции с индексируемым доступом к объектам, могут обеспечивать различные виды сортировки своего содержимого. Класс SCArray реализует ряд методов, которые позволяют выполнить такие операции сортировки. Для осуществления непосредственно процесса сортировки класс SCArray использует сортировщики - экземпляры классов, которые соответствуют протоколу SCSorter. При этом при вызове процессов сортировки массива программист может либо самостоятельно указать используемый сортировщик, либо воспользоваться сортировщиком по умолчанию. Более подробно сортировщики описываются в соответствующем разделе данного руководства.
В ходе выполнения операции сортировки определение последовательности объектов выполняется путем их сравнения между собой. Для этого у сравниваемых элементов вызывается метод compareWithObject: протокола SCCollectioning.
Класс SCArray объявляет следующие методы сортировки своего содержимого:
- (void)sortAscendingWithSorter:(
id<
SCSorter>)sorter;
- (void)sortDescendingWithSorter:(
id<
SCSorter>)sorter;
- (void)sortWithSorter:(
id<
SCSorter>)sorter;
- (void)sortAscending;
- (void)sortDescending;
- (void)sort;
- (
SCArray *)descendingSortedArray;
- Метод sortAscendingWithSorter: выполняет сортировку содержимого массива по возрастанию с использованием указанного сортировщика.
- Метод sortDescendingWithSorter: осуществляет сортировку объектов массива по убыванию с использованием заданного сортировщика.
- Метод sortWithSorter: сортирует массив по возрастанию с использованием указанного сортировщика и является аналогом метода sortAscendingWithSorter:.
- Метод sortAscending производит сортировку содержимого массива по возрастанию с использованием сортировщика по умолчанию.
- Метод sortDescending осуществляет сортировку массива по убыванию с применением сортировщика по умолчанию.
- Метод sort действует аналогично методу sortAscending, то есть сортирует массив по убыванию через вызов сортировщика по умолчанию.
[array addObject:@"String 04"];
[array addObject:@"String 01"];
[array addObject:@"String 00"];
[array addObject:@"String 02"];
[array addObject:@"String 03"];
NSLog( @"================ SOURCE ARRAY =================");
NSLog( @"%@", array);
NSLog( @"=========== ASCENDING SORTED ARRAY ============");
NSLog( @"%@", array);
NSLog( @"=========== DESCENDING SORTED ARRAY ===========");
NSLog( @"%@", array);
2016-07-22 10:25:14.707 libtest[7423:1366810] ================ SOURCE ARRAY =================
2016-07-22 10:25:14.707 libtest[7423:1366810] Array count=5: (
"String 04",
"String 01",
"String 00",
"String 02",
"String 03"
)
2016-07-22 10:25:14.708 libtest[7423:1366810] =========== ASCENDING SORTED ARRAY ============
2016-07-22 10:25:14.708 libtest[7423:1366810] Array count=5: (
"String 00",
"String 01",
"String 02",
"String 03",
"String 04"
)
2016-07-22 10:25:14.708 libtest[7423:1366810] =========== DESCENDING SORTED ARRAY ===========
2016-07-22 10:25:14.708 libtest[7423:1366810] Array count=5: (
"String 04",
"String 03",
"String 02",
"String 01",
"String 00"
)
- Метод ascendingSortedArrayWithSorter: возвращает копию исходного массива, объекты которого отсортированы по возрастанию с использованием указанного сортировщика.
- Метод descendingSortedArrayWithSorter: формирует копию исходного массива с сортировкой объектов по убыванию с применением заданного сортировщика.
- Метод sortedArrayWithSorter: является аналогом метода ascendingSortedArrayWithSorter: и также возвращает массив, который содержит отсортированные по возрастанию объекты исходного массива с применением указанного сортировщика.
- Метод ascendingSortedArray формирует и возвращает массив с отсортированными по возрастанию с использованием сортировщика по умолчанию объектами исходного массива.
- Метод descendingSortedArray создает массив из отсортированных по убыванию объектов исходного массива. При этом используется сортировщик по умолчанию.
- Свойство sortedArray возвращает массив из объектов исходного массива, отсортированных по возрастанию с применением сортировщика по умолчанию. Является аналогом метода ascendingSortedArray.
Кроме вышеперечисленных методов класс SCArray объявляет классовые методы создания массивов на основе отсортированных объектов существующих коллекций любого поддерживаемого типа:
+ (instancetype)arrayWithAscendingSortedCollection:(
id<
SCCollection>)collection sorter:(
id<
SCSorter>)sorter;
+ (instancetype)arrayWithDescendingSortedCollection:(
id<
SCCollection>)collection sorter:(
id<
SCSorter>)sorter;
+ (instancetype)arrayWithAscendingSortedCollection:(
id<
SCCollection>)collection;
+ (instancetype)arrayWithDescendingSortedCollection:(
id<
SCCollection>)collection;
+ (instancetype)arrayWithSortedCollection:(
id<
SCCollection>)collection;
Также SCArray объявляет методы инициализации экземпляров класса на основании существующих коллекций любого типа с сортировкой содержащихся в них объектов:
- (instancetype)initWithAscendingSortedCollection:(
id<
SCCollection>)collection sorter:(
id<
SCSorter>)sorter;
- (instancetype)initWithDescendingSortedCollection:(
id<
SCCollection>)collection sorter:(
id<
SCSorter>)sorter;
- (instancetype)initWithAscendingSortedCollection:(
id<
SCCollection>)collection;
- (instancetype)initWithDescendingSortedCollection:(
id<
SCCollection>)collection;
- (instancetype)initWithSortedCollection:(
id<
SCCollection>)collection;
В дополнение к методам копирования коллекций, унаследованных от класса SCCollection, и методам копирования массивов, SCArray содержит методы копирования коллекций с сортировкой исходных данных:
- (void)setAscendingSortedCollection:(
id<
SCCollection>)collection;
- (void)setDescendingSortedCollection:(
id<
SCCollection>)collection;
Добавление объектов в массив
В дополнение к общим для всех коллекций методам добавления объектов класс SCArray декларирует свои собственные методы, связанные прежде всего с поддержкой индексного доступа к своим объектам:
- (void)insertAtIndexes:(NSIndexSet *)indexes objects:(
id<
SCCollectioning>)object, ...;
- (void)insertCollection:(
id<
SCCollection>)collection atIndexes:(NSIndexSet *)indexes;
- Метод insertObject:atIndex: вставляет указанный объект в позицию с заданным индексом:
[array addObject:@"Object 00"];
[array addObject:@"Object 01"];
[array addObject:@"Object 02"];
[array addObject:@"Object 03"];
NSLog( @"%@", array);
NSLog( @"%@", array);
2016-07-22 11:31:05.699 libtest[7812:1401032] Array count=4: (
"Object 00",
"Object 01",
"Object 02",
"Object 03"
)
2016-07-22 11:31:05.699 libtest[7812:1401032] Array count=5: (
"Object 00",
"Object 01",
"=========",
"Object 02",
"Object 03"
)
- Метод insertAtIndex:objects: добавляет в массив по указанному индексу объекты из заданного завершаемого нулевым указателем списка:
[array addObject:@"Object 00"];
[array addObject:@"Object 01"];
[array addObject:@"Object 02"];
[array addObject:@"Object 03"];
NSLog( @"%@", array);
NSLog( @"%@", array);
2016-07-22 11:36:38.795 libtest[7861:1403442] Array count=4: (
"Object 00",
"Object 01",
"Object 02",
"Object 03"
)
2016-07-22 11:36:38.795 libtest[7861:1403442] Array count=7: (
"Object 00",
"Object 01",
"=========",
"Object AA",
"=========",
"Object 02",
"Object 03"
)
- Метод insertCollection:atIndex: вставляет по указанному индексу объекты из заданной коллекции любого поддерживаемого библиотекой типа:
[array addObject:@"Object 00"];
[array addObject:@"Object 01"];
[array addObject:@"Object 02"];
[array addObject:@"Object 03"];
NSLog( @"%@", array);
NSLog( @"%@", array);
2016-07-22 11:39:16.854 libtest[7896:1404848] Array count=4: (
"Object 00",
"Object 01",
"Object 02",
"Object 03"
)
2016-07-22 11:39:16.854 libtest[7896:1404848] Array count=7: (
"Object 00",
"Object 01",
"=========",
"Object XX",
"=========",
"Object 02",
"Object 03"
)
- Метод insertAtIndexes:objects: осуществляет вставку объектов из заданного завершаемого нулевым указателем списка по индексам массива из указанного множества индексов:
[array addObject:@"Object 00"];
[array addObject:@"Object 01"];
[array addObject:@"Object 02"];
[array addObject:@"Object 03"];
NSLog( @"%@", array);
NSMutableIndexSet *indexSet = [NSMutableIndexSet indexSet];
[indexSet addIndex:1];
[indexSet addIndex:2];
NSLog( @"%@", array);
2016-07-22 11:48:35.908 libtest[7992:1411049] Array count=4: (
"Object 00",
"Object 01",
"Object 02",
"Object 03"
)
2016-07-22 11:48:35.908 libtest[7992:1411049] Array count=6: (
"Object 00",
"=========",
"=========",
"Object 01",
"Object 02",
"Object 03"
)
- Метод insertCollection:atIndexes: выполняет вставку объектов указанной коллекции любого поддерживаемого библиотекой типа по индексам из заданного множества индексов:
[array addObject:@"Object 00"];
[array addObject:@"Object 01"];
[array addObject:@"Object 02"];
[array addObject:@"Object 03"];
NSLog( @"%@", array);
NSMutableIndexSet *indexSet = [NSMutableIndexSet indexSet];
[indexSet addIndex:1];
[indexSet addIndex:2];
NSLog( @"%@", array);
2016-07-22 11:56:41.190 libtest[8065:1416993] Array count=4: (
"Object 00",
"Object 01",
"Object 02",
"Object 03"
)
2016-07-22 11:56:41.190 libtest[8065:1416993] Array count=6: (
"Object 00",
"---------",
"---------",
"Object 01",
"Object 02",
"Object 03"
)
- Метод setObject:atIndex: заменяет объект массива с указанным индексом на заданный объект или добавляет объект в массив, если объекта с указанным индексом не существует:
[array addObject:@"Object 00"];
[array addObject:@"Object 01"];
[array addObject:@"Object 02"];
[array addObject:@"Object 03"];
NSLog( @"%@", array);
NSLog( @"%@", array);
2016-07-22 12:00:44.853 libtest[8098:1419094] Array count=4: (
"Object 00",
"Object 01",
"Object 02",
"Object 03"
)
2016-07-22 12:00:44.853 libtest[8098:1419094] Array count=5: (
"Object 00",
"=========",
"Object 02",
"Object 03",
"---------"
)
Удаление объектов массива
Для реализации механизма индексного доступа к объектам класс SCArray дополняет унаследованные от класса SCCollection методы удаления объектов своими собственными методами удаления данных:
- (void)removeFirstObject;
- (void)removeLastObject;
- (void)removeObjectAtIndex:(
SCIndex)index;
- (void)removeObjectsAtIndexes:(NSIndexSet *)indexes;
- (void)removeObjectsInRange:(NSRange)range;
- Метод removeFirstObject удаляет первый объект массива:
[array addObject:@"Object 00"];
[array addObject:@"Object 01"];
[array addObject:@"Object 02"];
[array addObject:@"Object 03"];
NSLog( @"%@", array);
NSLog( @"%@", array);
2016-07-22 12:50:33.098 libtest[8506:1455405] Array count=4: (
"Object 00",
"Object 01",
"Object 02",
"Object 03"
)
2016-07-22 12:50:33.098 libtest[8506:1455405] Array count=3: (
"Object 01",
"Object 02",
"Object 03"
)
- Метод removeLastObject удаляет из массива его последний объект:
[array addObject:@"Object 00"];
[array addObject:@"Object 01"];
[array addObject:@"Object 02"];
[array addObject:@"Object 03"];
NSLog( @"%@", array);
NSLog( @"%@", array);
2016-07-22 12:51:32.881 libtest[8525:1455783] Array count=4: (
"Object 00",
"Object 01",
"Object 02",
"Object 03"
)
2016-07-22 12:51:32.881 libtest[8525:1455783] Array count=3: (
"Object 00",
"Object 01",
"Object 02"
)
- Метод removeObjectAtIndex: удаляет из массива объект с указанным индексом:
[array addObject:@"Object 00"];
[array addObject:@"Object 01"];
[array addObject:@"Object 02"];
[array addObject:@"Object 03"];
NSLog( @"%@", array);
NSLog( @"%@", array);
2016-07-22 12:52:34.254 libtest[8548:1456319] Array count=4: (
"Object 00",
"Object 01",
"Object 02",
"Object 03"
)
2016-07-22 12:52:34.254 libtest[8548:1456319] Array count=3: (
"Object 00",
"Object 02",
"Object 03"
)
- Метод removeObjectsAtIndexes: удаляет из массива объекты с индексами из указанного множества индексов:
[array addObject:@"Object 00"];
[array addObject:@"Object 01"];
[array addObject:@"Object 02"];
[array addObject:@"Object 03"];
NSLog( @"%@", array);
NSMutableIndexSet *indexSet = [NSMutableIndexSet indexSet];
[indexSet addIndex:1];
[indexSet addIndex:3];
NSLog( @"%@", array);
2016-07-22 12:54:11.132 libtest[8582:1456999] Array count=4: (
"Object 00",
"Object 01",
"Object 02",
"Object 03"
)
2016-07-22 12:54:11.132 libtest[8582:1456999] Array count=2: (
"Object 00",
"Object 02"
)
- Метод removeObjectsInRange: удаляет из массива объекты в заданном диапазоне:
[array addObject:@"Object 00"];
[array addObject:@"Object 01"];
[array addObject:@"Object 02"];
[array addObject:@"Object 03"];
NSLog( @"%@", array);
NSRange range = NSMakeRange( 1, 2);
NSLog( @"%@", array);
2016-07-22 12:56:47.358 libtest[8610:1459386] Array count=4: (
"Object 00",
"Object 01",
"Object 02",
"Object 03"
)
2016-07-22 12:56:47.358 libtest[8610:1459386] Array count=2: (
"Object 00",
"Object 03"
)
Замена объектов массива
Класс SCArray декларирует следующие методы для осуществления замены объектов:
- (void)replaceObjectsAtIndexes:(NSIndexSet *)indexes withObjects:(
id<
SCCollectioning>)object, ...;
- (void)replaceObjectsAtIndexes:(NSIndexSet *)indexes withCollection:(
id<
SCCollection>)collection;
- (void)replaceObjectsInRange:(NSRange)range withObjects:(
id<
SCCollectioning>)object, ...;
- (void)replaceObjectsInRange:(NSRange)range withCollection:(
id<
SCCollection>)collection;
- Метод replaceObjectAtIndex:withObject: заменяет объект с указанным индексом на заданный объект. От метода setObject:atIndex: отличается тем, что при отсутствии объекта с указанным индексом генерируется ошибка SCL-20052, а не выполняется добавление элемента:
[array addObject:@"Object 00"];
[array addObject:@"Object 01"];
[array addObject:@"Object 02"];
[array addObject:@"Object 03"];
NSLog( @"%@", array);
NSLog( @"%@", array);
2016-07-22 13:41:38.478 libtest[8877:1486667] Array count=4: (
"Object 00",
"Object 01",
"Object 02",
"Object 03"
)
2016-07-22 13:41:38.478 libtest[8877:1486667] Array count=4: (
"Object 00",
"=========",
"Object 02",
"Object 03"
)
- Метод replaceObjectsAtIndexes:withObjects: осуществляет замену объектов по индексам из указанного множества индексов на объекты из завершаемого нулевым указателм списка. Количество объектов в списке должно соответствовать количеству индексов.
[array addObject:@"Object 00"];
[array addObject:@"Object 01"];
[array addObject:@"Object 02"];
[array addObject:@"Object 03"];
NSLog( @"%@", array);
NSMutableIndexSet *indexSet = [NSMutableIndexSet indexSet];
[indexSet addIndex:0];
[indexSet addIndex:3];
NSLog( @"%@", array);
2016-07-22 13:45:06.495 libtest[8933:1488667] Array count=4: (
"Object 00",
"Object 01",
"Object 02",
"Object 03"
)
2016-07-22 13:45:06.495 libtest[8933:1488667] Array count=4: (
"=========",
"Object 01",
"Object 02",
"========="
)
- Метод replaceObjectsAtIndexes:withCollection: выполняет замену объектов по индексам из заданного множества индексов на объекты из указанной коллекции любого поддерживаемого библиотекой типа. Количество объектов в коллекции должно соответствовать количеству индексов.
[array addObject:@"Object 00"];
[array addObject:@"Object 01"];
[array addObject:@"Object 02"];
[array addObject:@"Object 03"];
NSLog( @"%@", array);
NSMutableIndexSet *indexSet = [NSMutableIndexSet indexSet];
[indexSet addIndex:1];
[indexSet addIndex:2];
NSLog( @"%@", array);
2016-07-22 13:46:53.474 libtest[8959:1489294] Array count=4: (
"Object 00",
"Object 01",
"Object 02",
"Object 03"
)
2016-07-22 13:46:53.475 libtest[8959:1489294] Array count=4: (
"Object 00",
"=========",
"=========",
"Object 03"
)
- Метод replaceObjectsInRange:withObjects: осуществляет замену объектов в заданном диапазоне на объекты из указанного завершаемого нулевым указателем списка:
[array addObject:@"Object 00"];
[array addObject:@"Object 01"];
[array addObject:@"Object 02"];
[array addObject:@"Object 03"];
NSLog( @"%@", array);
NSRange range = NSMakeRange( 2, 2);
NSLog( @"%@", array);
2016-07-22 13:52:29.635 libtest[9011:1493525] Array count=4: (
"Object 00",
"Object 01",
"Object 02",
"Object 03"
)
2016-07-22 13:52:29.635 libtest[9011:1493525] Array count=4: (
"Object 00",
"Object 01",
"=========",
"========="
)
- Метод replaceObjectsInRange:withCollection: заменяет в массиве объекты в указанном диапазоне на объекты из заданной коллекции любого поддерживаемого библиотекой типа:
[array addObject:@"Object 00"];
[array addObject:@"Object 01"];
[array addObject:@"Object 02"];
[array addObject:@"Object 03"];
NSLog( @"%@", array);
NSRange range = NSMakeRange( 0, 2);
NSArray *source = [NSArray arrayWithObjects:@"=========", @"=========", nil];
NSLog( @"%@", array);
2016-07-22 14:01:32.564 libtest[9039:1496565] Array count=4: (
"Object 00",
"Object 01",
"Object 02",
"Object 03"
)
2016-07-22 14:01:32.564 libtest[9039:1496565] Array count=4: (
"=========",
"=========",
"Object 02",
"Object 03"
)
Копирование и перемещение объектов
Для копирования и перемещения объектов в массиве класс SCArray объявляет ряд методов. Рассмотрение таких методов мы начнем с метода exchangeObjectAtIndex:withObjectAtIndex:, который осуществляет обмен между объектами с указанными индексами:
- (void)exchangeObjectAtIndex:(
SCIndex)index withObjectAtIndex:(
SCIndex)destination;
[array addObject:@"Object 00"];
[array addObject:@"Object 01"];
[array addObject:@"Object 02"];
[array addObject:@"Object 03"];
NSLog( @"%@", array);
NSLog( @"%@", array);
2016-07-22 15:38:02.392 libtest[9467:1548785] Array count=4: (
"Object 00",
"Object 01",
"Object 02",
"Object 03"
)
2016-07-22 15:38:02.392 libtest[9467:1548785] Array count=4: (
"Object 03",
"Object 01",
"Object 02",
"Object 00"
)
Для дублирования объектов в классе SCArray декларированы следующие методы:
- (void)duplicateObjectAtIndex:(
SCIndex)index;
- (void)duplicateObjectsInRange:(NSRange)range;
- (void)duplicateAllObjects;
- (void)duplicate;
Чтобы данные методы могли работать, элементы массива должны соответствовать спецификации протокола SCCollectioning, и прежде всего иметь соответствующую реализацию метода copyObject.
- Метод duplicateObjectAtIndex: осуществляет дублирование объекта массива с указанным индексом, то есть копирует существующий объект и вставляет его перед исходным:
[array addObject:@"Object 00"];
[array addObject:@"Object 01"];
[array addObject:@"Object 02"];
[array addObject:@"Object 03"];
NSLog( @"%@", array);
NSLog( @"%@", array);
2016-07-22 15:45:44.172 libtest[9529:1554390] Array count=4: (
"Object 00",
"Object 01",
"Object 02",
"Object 03"
)
2016-07-22 15:45:44.173 libtest[9529:1554390] Array count=5: (
"Object 00",
"Object 01",
"Object 02",
"Object 02",
"Object 03"
)
- Метод duplicateObjectsInRange: создает копию объектов в указанном диапазоне и помещает его перед исходными объектами:
[array addObject:@"Object 00"];
[array addObject:@"Object 01"];
[array addObject:@"Object 02"];
[array addObject:@"Object 03"];
NSLog( @"%@", array);
NSRange range = NSMakeRange( 1, 2);
NSLog( @"%@", array);
2016-07-22 15:49:58.931 libtest[9559:1557433] Array count=4: (
"Object 00",
"Object 01",
"Object 02",
"Object 03"
)
2016-07-22 15:49:58.931 libtest[9559:1557433] Array count=6: (
"Object 00",
"Object 01",
"Object 02",
"Object 01",
"Object 02",
"Object 03"
)
- Метод duplicateAllObjects создает копию каждого объекта массива, размещая ее перед оригинальным объектом:
[array addObject:@"Object 00"];
[array addObject:@"Object 01"];
[array addObject:@"Object 02"];
[array addObject:@"Object 03"];
NSLog( @"%@", array);
NSLog( @"%@", array);
2016-07-22 16:00:43.341 libtest[9602:1564387] Array count=4: (
"Object 00",
"Object 01",
"Object 02",
"Object 03"
)
2016-07-22 16:00:43.341 libtest[9602:1564387] Array count=8: (
"Object 00",
"Object 00",
"Object 01",
"Object 01",
"Object 02",
"Object 02",
"Object 03",
"Object 03"
)
- Метод duplicate полностью дублирует все объекты массива, помещая копию перед огиналом. Фактически, после выполнения данного метода массив будет содержать две последовательные копии оригинального массива:
[array addObject:@"Object 00"];
[array addObject:@"Object 01"];
[array addObject:@"Object 02"];
[array addObject:@"Object 03"];
NSLog( @"%@", array);
NSLog( @"%@", array);
2016-07-22 16:10:47.411 libtest[9630:1567479] Array count=4: (
"Object 00",
"Object 01",
"Object 02",
"Object 03"
)
2016-07-22 16:10:47.411 libtest[9630:1567479] Array count=8: (
"Object 00",
"Object 01",
"Object 02",
"Object 03",
"Object 00",
"Object 01",
"Object 02",
"Object 03"
)
Копирование элементов объектов (требуется реализация метода copyObject) выполняется следующими методами класса SCArray:
- (void)copyObjectAtIndex:(
SCIndex)index toIndex:(
SCIndex)destination;
- (void)copyObjectsInRange:(NSRange)range toIndex:(
SCIndex)destination;
- Метод copyObjectAtIndex:toIndex: копирует объект с заданным индексом в указанную позицию:
[array addObject:@"Object 00"];
[array addObject:@"Object 01"];
[array addObject:@"Object 02"];
[array addObject:@"Object 03"];
NSLog( @"%@", array);
NSLog( @"%@", array);
2016-07-22 16:40:05.530 libtest[9913:1592911] Array count=4: (
"Object 00",
"Object 01",
"Object 02",
"Object 03"
)
2016-07-22 16:40:05.530 libtest[9913:1592911] Array count=5: (
"Object 00",
"Object 01",
"Object 00",
"Object 02",
"Object 03"
)
- Метод copyObjectsInRange:toIndex: копирует объекты в заданном диапазоне в указанную позицию:
[array addObject:@"Object 00"];
[array addObject:@"Object 01"];
[array addObject:@"Object 02"];
[array addObject:@"Object 03"];
NSLog( @"%@", array);
NSRange range = NSMakeRange( 0, 2);
NSLog( @"%@", array);
2016-07-22 16:43:22.648 libtest[9944:1594899] Array count=4: (
"Object 00",
"Object 01",
"Object 02",
"Object 03"
)
2016-07-22 16:43:22.648 libtest[9944:1594899] Array count=6: (
"Object 00",
"Object 01",
"Object 02",
"Object 00",
"Object 01",
"Object 03"
)
Перемещение объектов массива осуществляют следующие методы класса SCArray:
- (void)moveObjectAtIndex:(
SCIndex)index toIndex:(
SCIndex)destination;
- (void)moveObjectsInRange:(NSRange)range toIndex:(
SCIndex)destination;
- Метод moveObjectAtIndex:toIndex: осуществляет перемещение объекта массива с указанным индексом в заданную позицию:
[array addObject:@"Object 00"];
[array addObject:@"Object 01"];
[array addObject:@"Object 02"];
[array addObject:@"Object 03"];
NSLog( @"%@", array);
NSLog( @"%@", array);
2016-07-22 17:12:58.760 libtest[10026:1616064] Array count=4: (
"Object 00",
"Object 01",
"Object 02",
"Object 03"
)
2016-07-22 17:12:58.760 libtest[10026:1616064] Array count=4: (
"Object 01",
"Object 02",
"Object 00",
"Object 03"
)
- Метод moveObjectsInRange:toIndex: выполняет перемещение объектов массива в заданном диапазоне на указанную позицию:
[array addObject:@"Object 00"];
[array addObject:@"Object 01"];
[array addObject:@"Object 02"];
[array addObject:@"Object 03"];
NSLog( @"%@", array);
NSRange range = NSMakeRange( 0, 2);
NSLog( @"%@", array);
2016-07-22 17:15:52.892 libtest[10074:1617968] Array count=4: (
"Object 00",
"Object 01",
"Object 02",
"Object 03"
)
2016-07-22 17:15:52.892 libtest[10074:1617968] Array count=4: (
"Object 02",
"Object 03",
"Object 00",
"Object 01"
)
Дополнительно класс SCArray объявляет методы, осуществляющие реверсирование (то есть изменение порядка следования объектов массива на противоположный) содержимого массива:
[array addObject:@"Object 00"];
[array addObject:@"Object 01"];
[array addObject:@"Object 02"];
[array addObject:@"Object 03"];
NSLog( @"%@", array);
NSLog( @"%@", array);
2016-07-22 17:22:13.296 libtest[10119:1622519] Array count=4: (
"Object 00",
"Object 01",
"Object 02",
"Object 03"
)
2016-07-22 17:22:13.296 libtest[10119:1622519] Array count=4: (
"Object 03",
"Object 02",
"Object 01",
"Object 00"
)
Доступ к объектам массива
Класс SCArray объявляет следующие методы для доступа к объектам массива:
- (id)firstObject;
- (id)lastObject;
- (id)objectAtIndex:(
SCIndex)index;
- (
SCArray *)objectsAtIndexes:(NSIndexSet *)indexes;
- (
SCArray *)objectsInRange:(NSRange)range;
- Свойство firstObject возвращает первый объект массива. Если массив пуст, то возвращается пустой указатель:
2016-07-21 15:58:45.314 libtest[4990:942093] Array first object: Object 00
- Свойство lastObject аналогичен предыдущему методу, только возвращает последний объект массива:
NSLog(
@"Array last object: %@", array.
lastObject);
2016-07-21 16:01:57.614 libtest[5031:943478] Array last object: Object 02
- Метод objectAtIndex: возвращает объект массива с указанным индексом. Если такого элемента в массиве не существует, возникает ошибка SCL-20052:
NSLog( @"%@", [array objectAtIndex:1]);
2016-07-21 16:11:27.241 libtest[5072:948192] Object 01
- Метод objectsAtIndexes: возвращает новый массив, который содержит объекты только по индексам из указанного множества индексов. Если один или несколько индексов из множества оказываются некорректными (отсутствуют в исходном массиве), то они игнорируются:
NSMutableIndexSet *indexSet = [NSMutableIndexSet indexSet];
[indexSet addIndex:0];
[indexSet addIndex:2];
NSLog( @"%@", [array objectsAtIndexes:indexSet]);
indexSet = [NSMutableIndexSet indexSet];
[indexSet addIndex:1];
[indexSet addIndex:3];
NSLog( @"%@", [array objectsAtIndexes:indexSet]);
2016-07-21 16:17:37.845 libtest[5167:953186] Array count=2: (
"Object 00",
"Object 02"
)
2016-07-21 16:17:37.851 libtest[5167:953186] Array count=1: (
"Object 01"
)
- Метод objectsInRange: формирует массив, который содержит объекты исходного массива в заданном диапазоне. Если диапазон указан ошибочно, генерируется ошибка SCL-20053:
NSLog( @"%@", [array objectsInRange:NSMakeRange( 1, 2)]);
2016-07-21 16:25:34.720 libtest[5226:960949] Array count=2: (
"Object 01",
"Object 02"
)
Поиск объектов массива
Поиск объектов массива обеспечивается объявленными в классе SCArray методами:
- Метод indexOfObject: возвращает индекс указанного объекта в массиве. Если искомый объект в массиве не найден, возвращается значение NSNotFound:
NSLog( @"Object 01 index: %d", [array indexOfObject:@"Object 01"]);
NSLog( @"Object 11 index: %d", [array indexOfObject:@"Object 11"]);
2016-07-21 17:02:24.153 libtest[5488:986364] Object 01 index: 1
2016-07-21 17:02:24.153 libtest[5488:986364] Object 11 index: -1
- Метод inRange: аналогичен предыдущему методу, однако осуществляет поиск не по всему массиву, а только в указанном диапазоне (при задании ошибочного диапазона генерируется ошибка SCL-20053):
NSRange range = NSMakeRange( 4, 3);
NSLog( @"Index of 04: %d", [array indexOfObject:@"04" inRange:range]);
NSLog( @"Index of 07: %d", [array indexOfObject:@"07" inRange:range]);
2016-07-21 17:05:35.402 libtest[5523:988128] Index of 04: 4
2016-07-21 17:05:35.402 libtest[5523:988128] Index of 07: -1
- Свойство indexOfLastObject возвращает индекс последнего объекта массива или NSNotFound если массив пуст:
2016-07-21 17:09:03.368 libtest[5552:990330] Index of last object: 4
Неупорядоченные множества
Неупорядоченное множество - разновидность коллекций, которая представляет собой неупорядоченный набор объектов. Каждый объект хранится во множестве в единственном экземпляре вне зависимости от того, сколько раз он был добавлен во множество, что отличает множество от массивов и ряда других видов коллекций. Неупорядоченное множество не гарантирует определенный порядок хранения элементов и не предоставляет прямого доступа к конкретным объектам.
В библиотеке неупорядоченные множества реализованы на базе класса SCSet.
Создание неупорядоченных множеств
Для создания неупорядоченных множеств из последовательных файлов, словарей и потоков в классе SCSet объявлен следующий ряд классовых методов:
+ (instancetype)setWithCoder:(NSCoder *)coder;
+ (instancetype)setWithContentsOfSerializedFile:(NSString *)path;
+ (instancetype)setWithDataDictionary:(NSDictionary *)dictionary;
+ (instancetype)setWithDataDictionaryFromFile:(NSString *)path;
+ (instancetype)setWithStream:(
SCStream *)stream;
+ (instancetype)setWithFileStream:(NSString *)path;
Класс SCSet реализует следующие классовые методы для создания экземпляров класса:
+ (instancetype)setWithName:(NSString *)name;
+ (instancetype)setWithCollection:(
id<
SCCollection>)collection;
+ (instancetype)setWithSet:(
SCSet *)set;
+ (instancetype)set;
- Метод setWithName: возвращает пустое неупорядоченное множество с указанным именем:
2016-07-25 10:21:17.443 libtest[12358:1926852] Set "SampleSet" count=0: {
)}
- Метод setWithObject: создает неименованное неупорядоченное множество с указанным объектом в своем составе:
2016-07-25 10:22:26.707 libtest[12382:1927619] Set count=1: {(
"String"
)}
- Метод setWithObjects: возвращает созданное неименованное неупорядоченное множество с объектами из указанного завешаемого нулевым указателем списка:
2016-07-25 10:23:54.179 libtest[12409:1928270] Set count=3: {(
"Data",
"String",
"Object"
)}
- Метод setWithCollection: создает неупорядоченное множество из объектов указанной коллекции любого поддерживаемого библиотекой типа:
2016-07-25 10:26:26.474 libtest[12450:1929854] Set count=3: {(
"Source",
"Information",
"String"
)}
- Метод setWithSet: возвращает копию указанного существующего неупорядоченного множества:
2016-07-25 14:54:03.819 libtest[12824:2053546] Set count=3: {(
"Source",
"Information",
"String"
)}
- Метод set создает пустое неименованное неупорядоченное множество:
2016-07-25 15:02:32.395 libtest[12853:2059488] Set count=0: {
)}
Инициализация неупорядоченных множеств
Класс SCSet объявляет следующие методы инициализации экземпляров класса:
- (instancetype)initWithName:(NSString *)name;
- (instancetype)initWithCollection:(
id<
SCCollection>)collection;
- (instancetype)initWithSet:(
SCSet *)set;
- (instancetype)init;
- Метод initWithName: инициализирует пустое неупорядоченное множество с заданным именем.
- Метод initWithObject: инициализирует неименованное неупорядоченное множество с указанным объектом.
- Метод initWithObjects: выполняет инициализацию неименованного неупорядоченного множества с объектами из указанного завершаемого нулевым указателем списка.
- Метод initWithCollection: осуществляет инициализацию экземпляра класса с использованием параметров и объектов указанной существующей коллекции любого поддерживаемого библиотекой типа.
- Метод initWithSet: инициализирует экземпляр класса в виде копии существующего неупорядоченного множества.
- Метод init выполняет инициализацию пустого неименованного неупорядоченного множества.
Копирование неупорядоченных множеств
С помощью метода setSet: осуществляется удаление текущих настроек и содержимого неупорядоченного множества и замена их на параметры и объекты из указанного исходного множества:
- (void)setSet:(
SCSet *)set;
NSLog( @"%@", set);
NSLog( @"%@", set);
2016-07-25 16:54:30.830 libtest[1242:50070] Set count=3: {(
"String",
"System",
"Information"
)}
2016-07-25 16:54:30.830 libtest[1242:50070] Set count=3: {(
"Line 00",
"Line 01",
"Line 02"
)}
Сравнение неупорядоченных множеств
Для сравнения неупорядоченных множеств класс SCSet декларирует следующие методы:
- (BOOL)isEqualToSet:(
SCSet *)set;
- (BOOL)isEqualToSet:(
SCSet *)set;
- Метод isSubsetOfSet: определяет вхождение неупорядоченного множества в указанное неупорядоченное множество. Под вхождением понимается наличие всех объектов множества в другом множестве. В качестве аргумента метода может указываться коллекция любого поддерживаемого библиотекой типа:
NSLog( @"%d", [set isSubsetOfSet:original]);
[set addObject:@"06"];
NSLog( @"%d", [set isSubsetOfSet:original]);
2016-07-25 17:33:56.069 libtest[1426:74723] 1
2016-07-25 17:33:56.069 libtest[1426:74723] 0
- Метод intersectsSet: проверяет множество на пересечение с указанным множеством. Множества пересекаются, если у них имеется хотя бы один общий объект. В качестве аргумента метод воспринимает коллекцию любого поддерживаемого типа:
NSLog( @"%d", [set intersectsSet:original]);
[set removeObject:@"04"];
NSLog( @"%d", [set intersectsSet:original]);
2016-07-25 17:36:51.172 libtest[1452:76573] 1
2016-07-25 17:36:51.172 libtest[1452:76573] 0
- Метод isEqualToSet: выполняет сранение параметров и содержимого двух неупорядоченных множеств, возвращая значение YES только в том случае, если у сравниваемых множеств одинаковое как содержимое, так и значение параметров (прежде всего имя множества).
- Метод isEqualToContentsOfSet: осуществляет сравнение содержимого двух неупорядоченных множеств, игнорируя при этом параметры множеств.
Доступ к объектам
Для доступа к объектам неупорядоченного множества класс SCSet объявляет следующие свойства:
@property (nonatomic, retain, readonly, getter=allObjects)
SCArray *allObjects;
@property (nonatomic, retain, readonly, getter=anyObject) id anyObject;
- Свойство allObjects возвращает массив со списком всех объектов множества:
NSLog( @"%@", [set allObjects]);
2016-07-25 16:35:26.090 libtest[1098:38625] Array count=3: (
"String",
"System",
"Information"
)
- Свойство anyObject возвращает один из объектов множества или nil в случае пустого множества:
NSLog( @"%@", [set anyObject]);
2016-07-25 16:36:17.183 libtest[1130:39344] String
Комбинирование и рекомбинирование
Неупорядоченные множества на базе класса SCSet предоставляют следующие методы для осуществления операций комбинирования и рекомбинирования:
- Метод unionSet: добавляет в исходное неупорядоченное множество те объекты из указанного второго неупорядоченного множества, которые отсутствуют в исходном неупорядоченном множестве. Данная операция также называется объединением множеств. В качестве аргумента метод воспринимает коллекцию любого поддерживаемого типа:
NSLog( @"%@", set);
NSLog( @"%@", set);
2016-07-26 09:37:27.565 libtest[2761:411807] Set count=3: {(
"04",
"00",
"02"
)}
2016-07-26 09:37:27.565 libtest[2761:411807] Set count=5: {(
"01",
"04",
"00",
"03",
"02"
)}
- Метод minusSet: удаляет из исходного неупорядоченного множества объекты, входящие в указанное неупорядоченное множество. Данная операция носит название вычитание множества. В качестве второго (вычитаемого) множества может выступать коллекция любого поддерживаемого типа:
NSLog( @"%@", set);
NSLog( @"%@", set);
2016-07-26 09:43:08.223 libtest[2794:414790] Set count=5: {(
"01",
"04",
"00",
"03",
"02"
)}
2016-07-26 09:43:08.223 libtest[2794:414790] Set count=3: {(
"04",
"00",
"02"
)}
- Метод intersectSet: оставляет в исходном множестве только объекты, присутствующие во втором неупорядоченном множестве, в качестве которого может выступать коллекция любого поддерживаемого типа:
NSLog( @"%@", set);
NSLog( @"%@", set);
2016-07-26 09:46:20.929 libtest[2816:416605] Set count=5: {(
"01",
"04",
"00",
"03",
"02"
)}
2016-07-26 09:46:20.929 libtest[2816:416605] Set count=2: {(
"01",
"03"
)}
Упорядоченные множества
Упорядоченные множества на базе класса SCOrderedSet представляют собой множества объектов, отличающиеся от неупорядоченных множеств SCSet как поддержкой определенной последовательности объектов (отсюда и название), так и индексным доступом к объектам множества.
Упорядоченные множества сходны как с массивами (порядок объектов, индексный доступ), так и с неупорядоченными множествами - каждый объект присутствует в упорядоченном множестве только один раз.
Создание упорядоченных множеств
Создание упорядоченных множеств с использованием последовательных файлов, словарей и потоков осуществляется следующими классовыми методами класса SCOrderedSet:
+ (instancetype)orderedSetWithCoder:(NSCoder *)coder;
+ (instancetype)orderedSetWithContentsOfSerializedFile:(NSString *)path;
+ (instancetype)orderedSetWithDataDictionary:(NSDictionary *)dictionary;
+ (instancetype)orderedSetWithDataDictionaryFromFile:(NSString *)path;
+ (instancetype)orderedSetWithStream:(
SCStream *)stream;
+ (instancetype)orderedSetWithFileStream:(NSString *)path;
Для создания упорядоченных множеств класс SCOrderedSet декларирует следующие классовые методы
+ (instancetype)orderedSetWithName:(NSString *)name;
+ (instancetype)orderedSetWithCollection:(
id<
SCCollection>)collection;
+ (instancetype)orderedSetWithArray:(
SCArray *)array;
+ (instancetype)orderedSetWithSet:(
SCSet *)set;
+ (instancetype)orderedSetWithOrderedSet:(
SCOrderedSet *)orderedSet;
+ (instancetype)orderedSet;
- Классовый метод orderedSetWithName: создает пустое упорядоченное множество с указанным именем:
NSLog( @"%@", orderedSet);
2016-07-26 10:54:09.862 libtest[3149:454751] Ordered set "Sample Ordered Set" count=0: {
)}
- Классовый метод orderedSetWithObject: возвращает созданное упорядоченное множество с указанным объектом в качестве элемента:
NSLog( @"%@", orderedSet);
2016-07-26 10:56:24.434 libtest[3166:455918] Ordered set count=1: {(
"00"
)}
- Классовый метод orderedSetWithObjects: создает упорядоченное множество с объектами из указанного завершаемого нулевым указателем списка:
NSLog( @"%@", orderedSet);
2016-07-26 11:06:39.568 libtest[3191:458982] Ordered set count=3: {(
"00",
"02",
"01"
)}
- Классовый метод orderedSetWithCollection: создает и возвращает упорядоченное множество с объектами из заданной коллекции любого поддерживаемого типа:
NSArray *source = [NSArray arrayWithObjects:@"00", @"02", @"01", nil];
NSLog( @"%@", orderedSet);
2016-07-26 11:10:53.932 libtest[3230:461010] Ordered set count=3: {(
"00",
"02",
"01"
)}
- Классовый метод orderedSetWithArray: обеспечивает создание упорядоченного множества с объектами из указанного существующего массива (экземпляра класса SCArray):
NSLog( @"%@", orderedSet);
2016-07-26 11:12:38.291 libtest[3251:462189] Ordered set count=3: {(
"00",
"02",
"01"
)}
- Классовый метод orderedSetWithSet: создает упорядоченное множество с объектами из указанного существующего неупорядоченного множества:
NSLog( @"%@", orderedSet);
2016-07-26 11:14:55.740 libtest[3281:463482] Ordered set count=3: {(
"01",
"00",
"02"
)}
- Классовый метод orderedSetWithOrderedSet: возвращает созданное упорядоченное множество, являющееся копией указанного существующего упорядоченного множества:
NSLog( @"%@", orderedSet);
2016-07-26 11:16:40.621 libtest[3300:464470] Ordered set count=3: {(
"00",
"02",
"01"
)}
- Классовый метод orderedSet создает пустое неименованное упорядоченное множество:
NSLog( @"%@", orderedSet);
2016-07-26 11:18:19.393 libtest[3317:465430] Ordered set count=0: {
)}
Инициализация упорядоченных множеств
Класс SCOrderedSet декларирует следующие методы инициализации упорядоченных множеств:
- (instancetype)initWithName:(NSString *)name;
- (instancetype)initWithCollection:(
id<
SCCollection>)collection;
- (instancetype)initWithArray:(
SCArray *)array;
- (instancetype)initWithSet:(
SCSet *)set;
- (instancetype)initWithOrderedSet:(
SCOrderedSet *)orderedSet;
- (instancetype)init;
- Метод initWithName: инициализирует пустое упорядоченное множество с указанным именем.
- Метод initWithObject выполняет инициализацию неименованного упорядоченного множества с указанным объектом в качестве содержимого множества.
- Метод initWithObjects: осуществляет инициализацию неименованного упорядоченного множества с объектами из заданного завершаемого нулевым указателем списка.
- Метод initWithCollection: возвращает инициализированное упорядоченное множество с объектами из указанной коллекции любого поддерживаемого типа.
- Метод initWithArray: инициализирует упорядоченное множество с объектами из указанного существующего массива (экземпляра класса SCArray).
- Метод initWithSet: осуществляет инициализацию упорядоченного множества с объектами из заданного существующего неупорядоченного множества.
- Метод initWithOrderedSet: возвращает инициализированное упорядоченное множество как копию указанного существующего упорядоченного множества.
- Метод init инициализирует неименованное пустое неупорядоченное множество.
Копирование упорядоченных множеств
Класс SCOrderedSet объявляет следующие методы копирования упорядоченных множеств:
- (void)setSet:(
SCSet *)set;
- Метод setSet: удаляет текущее содержимое и настройки упорядоченного множества и копирует объекты и параметры из указанного существующего неупорядоченного множества:
NSLog( @"%@", orderedSet);
NSLog( @"%@", orderedSet);
2016-07-26 14:42:13.786 libtest[4326:584007] Ordered set count=3: {(
"00",
"01",
"02"
)}
2016-07-26 14:42:13.786 libtest[4326:584007] Ordered set count=3: {(
"12",
"11",
"10"
)}
- Метод setOrderedSet: стирает существующие объекты и параметры упорядоченного множества и заменяет их объектами и настройками заданного существующего упорядоченного множества.
NSLog( @"%@", orderedSet);
NSLog( @"%@", orderedSet);
2016-07-26 14:45:29.657 libtest[4352:585705] Ordered set count=3: {(
"00",
"01",
"02"
)}
2016-07-26 14:45:29.658 libtest[4352:585705] Ordered set count=3: {(
"10",
"11",
"12"
)}
Сравнение упорядоченных множеств
Класс SCOrderedSet содержит ряд методов для выполнения сравнений с упорядоченными и неупорядоченными множествами:
- (BOOL)isEqualToContentsOfOrderedSet:(
SCOrderedSet *)orderedSet;
- Методы isSubsetOfOrderedSet: и isSubsetOfSet: проверяют, входит ли исходное упорядоченное множество в указанное упорядоченное или неупорядоченное множество. Множество входит в заданное множество в том случае, если все его объекты также являются объектами второго множества:
NSLog( @"%d", [orderedSet isSubsetOfSet:set]);
NSLog( @"%d", [orderedSet isSubsetOfOrderedSet:source]);
2016-07-26 15:44:30.141 libtest[4701:621519] 1
2016-07-26 15:44:30.141 libtest[4701:621519] 0
- Методы intersectsOrderedSet: и intersectsSet: выполняют проверку пересечения исходного упорядоченного множества с заданным упорядоченным или неупорядоченным множеством. Множество пересекается с указанным множеством, если хотя бы один его объект также является объектом второго множества:
NSLog( @"%d", [orderedSet intersectsSet:set]);
NSLog( @"%d", [orderedSet intersectsOrderedSet:source]);
2016-07-26 15:55:25.821 libtest[4737:625668] 1
2016-07-26 15:55:25.821 libtest[4737:625668] 0
Сортировка упорядоченных множеств
Поскольку упорядоченные множества поддерживают индексную адресацию объектов, они обеспечивают различные виды сортировки своего содержимого. Класс SCOrderedSet реализует ряд методов, которые позволяют выполнять такие операции. Для осуществления непосредственно процесса сортировки класс SCOrderedSet применяет сортировщики - экземпляры соответствующих протоколу SCSorter классов. При этом при вызове процессов сортировки массива программист может либо самостоятельно указать используемый сортировщик, либо воспользоваться сортировщиком по умолчанию. Более подробно сортировщики описываются в соответствующем разделе данного руководства.
В ходе выполнения операции сортировки определение последовательности объектов осуществляется путем их сравнения между собой. Для этого у сравниваемых элементов вызывается метод compareWithObject: протокола SCCollectioning.
Класс SCOrderedSet объявляет следующие методы сортировки своего содержимого:
- (void)sortAscendingWithSorter:(
id<
SCSorter>)sorter;
- (void)sortDescendingWithSorter:(
id<
SCSorter>)sorter;
- (void)sortWithSorter:(
id<
SCSorter>)sorter;
- (void)sortAscending;
- (void)sortDescending;
- (void)sort;
- Метод sortAscendingWithSorter: выполняет сортировку содержимого упорядоченного множества по возрастанию с использованием указанного сортировщика.
- Метод sortDescendingWithSorter: осуществляет сортировку объектов упорядоченного множества по убыванию с использованием заданного сортировщика.
- Метод sortWithSorter: сортирует упорядоченное множество по возрастанию с использованием указанного сортировщика и является аналогом метода sortAscendingWithSorter:.
- Метод sortAscending производит сортировку содержимого упорядоченного множества по возрастанию с использованием сортировщика по умолчанию.
- Метод sortDescending осуществляет сортировку упорядоченного множества по убыванию с применением сортировщика по умолчанию.
- Метод sort действует аналогично методу sortAscending, то есть сортирует упорядоченное множество по убыванию через вызов сортировщика по умолчанию.
[orderedSet addObject:@"04"];
[orderedSet addObject:@"01"];
[orderedSet addObject:@"00"];
[orderedSet addObject:@"02"];
[orderedSet addObject:@"03"];
NSLog( @"================ SOURCE ORDERED SET =================");
NSLog( @"%@", orderedSet);
NSLog( @"=========== ASCENDING SORTED ORDERED SET ============");
NSLog( @"%@", orderedSet);
NSLog( @"=========== DESCENDING SORTED ORDERED SET ===========");
NSLog( @"%@", orderedSet);
2016-07-26 16:53:02.377 libtest[5100:665305] ================ SOURCE ORDERED SET =================
2016-07-26 16:53:02.377 libtest[5100:665305] Ordered set count=5: {(
"04",
"01",
"00",
"02",
"03"
)}
2016-07-26 16:53:02.378 libtest[5100:665305] =========== ASCENDING SORTED ORDERED SET ============
2016-07-26 16:53:02.378 libtest[5100:665305] Ordered set count=5: {(
"00",
"01",
"02",
"03",
"04"
)}
2016-07-26 16:53:02.378 libtest[5100:665305] =========== DESCENDING SORTED ORDERED SET ===========
2016-07-26 16:53:02.378 libtest[5100:665305] Ordered set count=5: {(
"04",
"03",
"02",
"01",
"00"
)}
- Метод ascendingSortedOrderedSetWithSorter: возвращает копию исходного упорядоченного множества, объекты которого отсортированы по возрастанию с использованием указанного сортировщика.
- Метод descendingSortedOrderedSetWithSorter: формирует копию исходного упорядоченного множества с сортировкой объектов по убыванию с применением заданного сортировщика.
- Метод sortedOrderedSetWithSorter: является аналогом метода ascendingSortedOrderedSetWithSorter: и также возвращает упорядоченное множество, которое содержит отсортированные по возрастанию объекты исходного упорядоченного множества с применением указанного сортировщика.
- Метод ascendingSortedOrderedSet формирует и возвращает упорядоченное множество с отсортированными по возрастанию с использованием сортировщика по умолчанию объектами исходного упорядоченного множества.
- Метод descendingSortedOrderedSet создает упорядоченное множество из отсортированных по убыванию объектов исходного упорядоченного множества. При этом используется сортировщик по умолчанию.
- Свойство sortedOrderedSet возвращает упорядоченное множество из объектов исходного упорядоченного множества, отсортированных по возрастанию с применением сортировщика по умолчанию. Является аналогом метода ascendingSortedOrderedSet.
Кроме вышеперечисленных методов класс SCOrderedSet объявляет классовые методы создания упорядоченных множеств на основе отсортированных объектов существующих коллекций любого поддерживаемого типа:
+ (instancetype)orderedSetWithAscendingSortedCollection:(
id<
SCCollection>)collection sorter:(
id<
SCSorter>)sorter;
+ (instancetype)orderedSetWithDescendingSortedCollection:(
id<
SCCollection>)collection sorter:(
id<
SCSorter>)sorter;
+ (instancetype)orderedSetWithSortedCollection:(
id<
SCCollection>)collection sorter:(
id<
SCSorter>)sorter;
+ (instancetype)orderedSetWithAscendingSortedCollection:(
id<
SCCollection>)collection;
+ (instancetype)orderedSetWithDescendingSortedCollection:(
id<
SCCollection>)collection;
+ (instancetype)orderedSetWithSortedCollection:(
id<
SCCollection>)collection;
Также SCOrderedSet объявляет методы инициализации экземпляров класса на основании существующих коллекций любого типа с сортировкой содержащихся в них объектов:
- (instancetype)initWithAscendingSortedCollection:(
id<
SCCollection>)collection sorter:(
id<
SCSorter>)sorter;
- (instancetype)initWithDescendingSortedCollection:(
id<
SCCollection>)collection sorter:(
id<
SCSorter>)sorter;
- (instancetype)initWithAscendingSortedCollection:(
id<
SCCollection>)collection;
- (instancetype)initWithDescendingSortedCollection:(
id<
SCCollection>)collection;
- (instancetype)initWithSortedCollection:(
id<
SCCollection>)collection;
В дополнение к методам копирования коллекций, унаследованных от класса SCCollection, и методам копирования упорядоченных, SCOrderedSet содержит методы копирования упорядоченных множеств с сортировкой исходных данных:
- (void)setAscendingSortedCollection:(
id<
SCCollection>)collection;
- (void)setDescendingSortedCollection:(
id<
SCCollection>)collection;
Добавление объектов в упорядоченное множество
В дополнение к общим для всех коллекций методам добавления объектов класс SCOrderedSet декларирует свои собственные методы, связанные прежде всего с поддержкой индексного доступа к своим объектам. Обращаем внимание, что каждый объект можно добавить в упорядоченное множество только один раз - повторная попытка добавить объект будет проигнорирована:
- (void)insertAtIndexes:(NSIndexSet *)indexes objects:(
id<
SCCollectioning>)object, ...;
- (void)insertCollection:(
id<
SCCollection>)collection atIndexes:(NSIndexSet *)indexes;
- Метод insertObject:atIndex: вставляет указанный объект в позицию с заданным индексом:
[orderedSet addObject:@"Object 00"];
[orderedSet addObject:@"Object 01"];
[orderedSet addObject:@"Object 02"];
[orderedSet addObject:@"Object 03"];
NSLog( @"%@", orderedSet);
NSLog( @"%@", orderedSet);
2016-07-26 17:32:25.025 libtest[5549:699992] Ordered set count=4: {(
"Object 00",
"Object 01",
"Object 02",
"Object 03"
)}
2016-07-26 17:32:25.025 libtest[5549:699992] Ordered set count=5: {(
"Object 00",
"Object 01",
"=========",
"Object 02",
"Object 03"
)}
- Метод insertAtIndex:objects: добавляет в упорядоченное множество по указанному индексу объекты из заданного завершаемого нулевым указателем списка:
[orderedSet addObject:@"Object 00"];
[orderedSet addObject:@"Object 01"];
[orderedSet addObject:@"Object 02"];
[orderedSet addObject:@"Object 03"];
NSLog( @"%@", orderedSet);
NSLog( @"%@", orderedSet);
2016-07-26 17:33:32.735 libtest[5569:701031] Ordered set count=4: {(
"Object 00",
"Object 01",
"Object 02",
"Object 03"
)}
2016-07-26 17:33:32.736 libtest[5569:701031] Ordered set count=7: {(
"Object 00",
"Object 01",
"=========",
"Object AA",
"---------",
"Object 02",
"Object 03"
)}
- Метод insertCollection:atIndex: вставляет по указанному индексу объекты из заданной коллекции любого поддерживаемого библиотекой типа:
[orderedSet addObject:@"Object 00"];
[orderedSet addObject:@"Object 01"];
[orderedSet addObject:@"Object 02"];
[orderedSet addObject:@"Object 03"];
NSLog( @"%@", orderedSet);
NSLog( @"%@", orderedSet);
2016-07-26 17:38:36.784 libtest[5607:703539] Ordered set count=4: {(
"Object 00",
"Object 01",
"Object 02",
"Object 03"
)}
2016-07-26 17:38:36.784 libtest[5607:703539] Ordered set count=7: {(
"Object 00",
"Object 01",
"=========",
"Object XX",
"---------",
"Object 02",
"Object 03"
)}
- Метод insertAtIndexes:objects: осуществляет вставку объектов из заданного завершаемого нулевым указателем списка по индексам упорядоченного множества из указанного множества индексов:
[orderedSet addObject:@"Object 00"];
[orderedSet addObject:@"Object 01"];
[orderedSet addObject:@"Object 02"];
[orderedSet addObject:@"Object 03"];
NSLog( @"%@", orderedSet);
NSMutableIndexSet *indexSet = [NSMutableIndexSet indexSet];
[indexSet addIndex:1];
[indexSet addIndex:2];
NSLog( @"%@", orderedSet);
2016-07-26 17:39:39.909 libtest[5629:704448] Ordered set count=4: {(
"Object 00",
"Object 01",
"Object 02",
"Object 03"
)}
2016-07-26 17:39:39.910 libtest[5629:704448] Ordered set count=6: {(
"Object 00",
"=========",
"---------",
"Object 01",
"Object 02",
"Object 03"
)}
- Метод insertCollection:atIndexes: выполняет вставку объектов указанной коллекции любого поддерживаемого библиотекой типа по индексам из заданного множества индексов:
[orderedSet addObject:@"Object 00"];
[orderedSet addObject:@"Object 01"];
[orderedSet addObject:@"Object 02"];
[orderedSet addObject:@"Object 03"];
NSLog( @"%@", orderedSet);
NSMutableIndexSet *indexSet = [NSMutableIndexSet indexSet];
[indexSet addIndex:1];
[indexSet addIndex:2];
NSLog( @"%@", orderedSet);
2016-07-26 17:41:50.263 libtest[5654:706235] Ordered set count=4: {(
"Object 00",
"Object 01",
"Object 02",
"Object 03"
)}
2016-07-26 17:41:50.263 libtest[5654:706235] Ordered set count=6: {(
"Object 00",
"---------",
"=========",
"Object 01",
"Object 02",
"Object 03"
)}
- Метод setObject:atIndex: заменяет объект упорядоченного множества с указанным индексом на заданный объект или добавляет объект в упорядоченное множество, если объекта с указанным индексом не существует:
[orderedSet addObject:@"Object 00"];
[orderedSet addObject:@"Object 01"];
[orderedSet addObject:@"Object 02"];
[orderedSet addObject:@"Object 03"];
NSLog( @"%@", orderedSet);
NSLog( @"%@", orderedSet);
2016-07-26 17:43:13.001 libtest[5676:707389] Ordered set count=4: {(
"Object 00",
"Object 01",
"Object 02",
"Object 03"
)}
2016-07-26 17:43:13.001 libtest[5676:707389] Ordered set count=5: {(
"Object 00",
"=========",
"Object 02",
"Object 03",
"---------"
)}
Удаление объектов из упорядоченного множества
Для реализации механизма индексного доступа к объектам класс SCOrderedSet дополняет унаследованные от класса SCCollection методы удаления объектов своими собственными методами удаления данных:
- (void)removeFirstObject;
- (void)removeLastObject;
- (void)removeObjectAtIndex:(
SCIndex)index;
- (void)removeObjectsAtIndexes:(NSIndexSet *)indexes;
- (void)removeObjectsInRange:(NSRange)range;
- Метод removeFirstObject удаляет первый объект упорядоченного множества:
[orderedSet addObject:@"Object 00"];
[orderedSet addObject:@"Object 01"];
[orderedSet addObject:@"Object 02"];
[orderedSet addObject:@"Object 03"];
NSLog( @"%@", orderedSet);
NSLog( @"%@", orderedSet);
2016-07-31 09:12:13.634 libtest[10663:2559320] Ordered set count=4: {(
"Object 00",
"Object 01",
"Object 02",
"Object 03"
)}
2016-07-31 09:12:13.634 libtest[10663:2559320] Ordered set count=3: {(
"Object 01",
"Object 02",
"Object 03"
)}
- Метод removeLastObject удаляет из упорядоченного множества его последний объект:
[orderedSet addObject:@"Object 00"];
[orderedSet addObject:@"Object 01"];
[orderedSet addObject:@"Object 02"];
[orderedSet addObject:@"Object 03"];
NSLog( @"%@", orderedSet);
NSLog( @"%@", orderedSet);
2016-07-31 09:15:43.558 libtest[10687:2561724] Ordered set count=4: {(
"Object 00",
"Object 01",
"Object 02",
"Object 03"
)}
2016-07-31 09:15:43.559 libtest[10687:2561724] Ordered set count=3: {(
"Object 00",
"Object 01",
"Object 02"
)}
- Метод removeObjectAtIndex: удаляет из упорядоченного множества объект с указанным индексом:
[orderedSet addObject:@"Object 00"];
[orderedSet addObject:@"Object 01"];
[orderedSet addObject:@"Object 02"];
[orderedSet addObject:@"Object 03"];
NSLog( @"%@", orderedSet);
NSLog( @"%@", orderedSet);
2016-07-31 09:53:53.227 libtest[10766:2579288] Ordered set count=4: {(
"Object 00",
"Object 01",
"Object 02",
"Object 03"
)}
2016-07-31 09:53:53.228 libtest[10766:2579288] Ordered set count=3: {(
"Object 00",
"Object 02",
"Object 03"
)}
- Метод removeObjectsAtIndexes: удаляет из упорядоченного множества объекты с индексами из указанного множества индексов:
[orderedSet addObject:@"Object 00"];
[orderedSet addObject:@"Object 01"];
[orderedSet addObject:@"Object 02"];
[orderedSet addObject:@"Object 03"];
NSLog( @"%@", orderedSet);
NSMutableIndexSet *indexSet = [NSMutableIndexSet indexSet];
[indexSet addIndex:1];
[indexSet addIndex:3];
NSLog( @"%@", orderedSet);
2016-07-31 09:56:12.806 libtest[10791:2580745] Ordered set count=4: {(
"Object 00",
"Object 01",
"Object 02",
"Object 03"
)}
2016-07-31 09:56:12.806 libtest[10791:2580745] Ordered set count=2: {(
"Object 00",
"Object 02"
)}
- Метод removeObjectsInRange: удаляет из упорядоченного множества объекты в указанном диапазоне:
[orderedSet addObject:@"Object 00"];
[orderedSet addObject:@"Object 01"];
[orderedSet addObject:@"Object 02"];
[orderedSet addObject:@"Object 03"];
NSLog( @"%@", orderedSet);
NSRange range = NSMakeRange( 1, 2);
NSLog( @"%@", orderedSet);
2016-07-31 09:59:20.185 libtest[10821:2583031] Ordered set count=4: {(
"Object 00",
"Object 01",
"Object 02",
"Object 03"
)}
2016-07-31 09:59:20.185 libtest[10821:2583031] Ordered set count=2: {(
"Object 00",
"Object 03"
)}
Замена объектов упорядоченного множества
В классе SCOrderedSet объявлены следующие методы замены объектов:
- (void)replaceObjectsAtIndexes:(NSIndexSet *)indexes withObjects:(
id<
SCCollectioning>)object, ...;
- (void)replaceObjectsAtIndexes:(NSIndexSet *)indexes withCollection:(
id<
SCCollection>)collection;
- (void)replaceObjectsInRange:(NSRange)range withObjects:(
id<
SCCollectioning>)object, ...;
- (void)replaceObjectsInRange:(NSRange)range withCollection:(
id<
SCCollection>)collection;
- Метод replaceObjectAtIndex:withObject: заменяет объект с указанным индексом на заданный объект. От метода setObject:atIndex: отличается тем, что при отсутствии объекта с указанным индексом генерируется ошибка SCL-20052, а не выполняется его добавление:
[orderedSet addObject:@"Object 00"];
[orderedSet addObject:@"Object 01"];
[orderedSet addObject:@"Object 02"];
[orderedSet addObject:@"Object 03"];
NSLog( @"%@", orderedSet);
NSLog( @"%@", orderedSet);
2016-07-31 10:17:03.999 libtest[11005:2599915] Ordered set count=4: {(
"Object 00",
"Object 01",
"Object 02",
"Object 03"
)}
2016-07-31 10:17:03.999 libtest[11005:2599915] Ordered set count=4: {(
"Object 00",
"=========",
"Object 02",
"Object 03"
)}
- Метод replaceObjectsAtIndexes:withObjects: осуществляет замену объектов по индексам из указанного множества индексов на объекты из завершаемого нулевым указателм списка. Количество объектов в списке должно соответствовать количеству индексов.
[orderedSet addObject:@"Object 00"];
[orderedSet addObject:@"Object 01"];
[orderedSet addObject:@"Object 02"];
[orderedSet addObject:@"Object 03"];
NSLog( @"%@", orderedSet);
NSMutableIndexSet *indexSet = [NSMutableIndexSet indexSet];
[indexSet addIndex:0];
[indexSet addIndex:3];
NSLog( @"%@", orderedSet);
2016-07-31 10:18:36.498 libtest[11028:2601079] Ordered set count=4: {(
"Object 00",
"Object 01",
"Object 02",
"Object 03"
)}
2016-07-31 10:18:36.499 libtest[11028:2601079] Ordered set count=4: {(
"=========",
"Object 01",
"Object 02",
"---------"
)}
- Метод replaceObjectsAtIndexes:withCollection: выполняет замену объектов по индексам из заданного множества индексов на объекты из указанной коллекции любого поддерживаемого библиотекой типа. Количество объектов в коллекции должно соответствовать количеству индексов.
[orderedSet addObject:@"Object 00"];
[orderedSet addObject:@"Object 01"];
[orderedSet addObject:@"Object 02"];
[orderedSet addObject:@"Object 03"];
NSLog( @"%@", orderedSet);
NSMutableIndexSet *indexSet = [NSMutableIndexSet indexSet];
[indexSet addIndex:1];
[indexSet addIndex:2];
NSLog( @"%@", orderedSet);
2016-07-31 10:20:29.789 libtest[11059:2602638] Ordered set count=4: {(
"Object 00",
"Object 01",
"Object 02",
"Object 03"
)}
2016-07-31 10:20:29.789 libtest[11059:2602638] Ordered set count=4: {(
"Object 00",
"---------",
"=========",
"Object 03"
)}
- Метод replaceObjectsInRange:withObjects: осуществляет замену объектов в заданном диапазоне на объекты из указанного завершаемого нулевым указателем списка:
[orderedSet addObject:@"Object 00"];
[orderedSet addObject:@"Object 01"];
[orderedSet addObject:@"Object 02"];
[orderedSet addObject:@"Object 03"];
NSLog( @"%@", orderedSet);
NSRange range = NSMakeRange( 2, 2);
NSLog( @"%@", orderedSet);
2016-07-31 10:22:37.616 libtest[11086:2604659] Ordered set count=4: {(
"Object 00",
"Object 01",
"Object 02",
"Object 03"
)}
2016-07-31 10:22:37.616 libtest[11086:2604659] Ordered set count=4: {(
"Object 00",
"Object 01",
"=========",
"---------"
)}
- Метод replaceObjectsInRange:withCollection: заменяет в упорядоченном множестве объекты в указанном диапазоне на объекты из заданной коллекции любого поддерживаемого библиотекой типа:
[orderedSet addObject:@"Object 00"];
[orderedSet addObject:@"Object 01"];
[orderedSet addObject:@"Object 02"];
[orderedSet addObject:@"Object 03"];
NSLog( @"%@", orderedSet);
NSRange range = NSMakeRange( 0, 2);
NSArray *source = [NSArray arrayWithObjects:@"=========", @"---------", nil];
NSLog( @"%@", orderedSet);
2016-07-31 10:23:52.218 libtest[11111:2606214] Ordered set count=4: {(
"Object 00",
"Object 01",
"Object 02",
"Object 03"
)}
2016-07-31 10:23:52.218 libtest[11111:2606214] Ordered set count=4: {(
"=========",
"---------",
"Object 02",
"Object 03"
)}
Перемещение объектов упорядоченного множества
Перемещение объектов упорядоченного множества осуществляется следующими методами класса SCOrderedSet:
- (void)exchangeObjectAtIndex:(
SCIndex)index withObjectAtIndex:(
SCIndex)destination;
- (void)moveObjectAtIndex:(
SCIndex)index toIndex:(
SCIndex)destination;
- (void)reverse;
- Метод exchangeObjectAtIndex:withObjectAtIndex: выполняет обмен объектами по указанным индексам:
NSLog( @"%@", orderedSet);
NSLog( @"%@", orderedSet);
2016-07-31 21:13:19.872 libtest[12438:2843276] Ordered set count=4: {(
"00",
"01",
"02",
"03"
)}
2016-07-31 21:13:19.872 libtest[12438:2843276] Ordered set count=4: {(
"03",
"01",
"02",
"00"
)}
- Метод moveObjectAtIndex:toIndex: перемещает объект с указанным индексом по заданному индексу:
NSLog( @"%@", orderedSet);
NSLog( @"%@", orderedSet);
2016-07-31 21:17:26.065 libtest[12458:2844716] Ordered set count=4: {(
"00",
"01",
"02",
"03"
)}
2016-07-31 21:17:26.065 libtest[12458:2844716] Ordered set count=4: {(
"01",
"02",
"00",
"03"
)}
- Метод reverse изменяет порядок следования объектов упорядоченного множества на обратный:
NSLog( @"%@", orderedSet);
NSLog( @"%@", orderedSet);
2016-07-31 21:20:25.235 libtest[12487:2846893] Ordered set count=4: {(
"00",
"01",
"02",
"03"
)}
2016-07-31 21:20:25.235 libtest[12487:2846893] Ordered set count=4: {(
"03",
"02",
"01",
"00"
)}
Доступ к объектам упорядоченного множества
В классе SCOrderedSet декларированы следующие методы доступа к объектам неупорядоченного множества:
- (id)firstObject;
- (id)lastObject;
- (id)objectAtIndex:(
SCIndex)index;
- (
SCArray *)objectsAtIndexes:(NSIndexSet *)indexes;
- Свойство allObjects возвращает массив, содержащий все объекты упорядоченного множества:
NSLog( @"%@", [orderedSet allObjects]);
2016-07-26 13:30:11.708 libtest[3953:541772] Array count=3: (
"00",
"02",
"01"
)
- Свойство firstObject возвращает первый объект упорядоченного множества или нулевой указатель для пустого упорядоченного множества:
NSLog( @"%@", [orderedSet firstObject]);
2016-07-26 13:40:59.909 libtest[3990:544807] 00
- Свойство lastObject возвращает последний объект упорядоченного множества. Если множество является пустым, возвращается нулевой указатель:
NSLog( @"%@", [orderedSet lastObject]);
2016-07-26 13:46:09.258 libtest[4012:547211] 01
- Метод objectAtIndex: возвращает объект упорядоченного множества с заданным индексом. При указании несуществующего индекса генерируется ошибка SCL-20052:
NSLog( @"%@", [orderedSet objectAtIndex:1]);
2016-07-26 13:50:05.347 libtest[4035:549560] 02
- Метод objectsAtIndexes: формирует и возвращает массив, в котором содержатся объекты неупорядоченного множества с индексами из указанного в качестве аргумента множества индексов. Если в переданном множестве индексов содержится ошибка, генерируется исключительная ситуация SCL-20054:
NSMutableIndexSet *indexSet = [NSMutableIndexSet indexSet];
[indexSet addIndex:0];
[indexSet addIndex:2];
[indexSet addIndex:4];
NSLog( @"%@", [orderedSet objectsAtIndexes:indexSet]);
2016-07-26 13:53:23.937 libtest[4064:551396] Array count=3: (
"00",
"02",
"04"
)
- Свойство reversedOrderedSet возвращает упорядоченное множество, в котором порядок следования объектов по сравнению с исходным упорядоченным множеством изменен на противоположный:
NSLog( @"%@", [orderedSet reversedOrderedSet]);
2016-07-26 13:54:53.571 libtest[4083:552496] Ordered set count=5: {(
"04",
"03",
"02",
"01",
"00"
)}
Поиск объектов упорядоченного множества
Поиск объектов упорядоченного множества осуществляют следующие методы класса SCOrderedSet:
- Метод indexOfObject: возвращает индекс указанного объекта в упорядоченном множестве. Если искомый объект не входит в упорядоченное множество, метод возвращает значение NSNotFound:
NSLog( @"%d", [orderedSet indexOfObject:@"02"]);
NSLog( @"%d", [orderedSet indexOfObject:@"04"]);
2016-07-26 15:20:47.680 libtest[4490:608235] 2
2016-07-26 15:20:47.680 libtest[4490:608235] -1
- Свойство indexOfLastObject возвращает индекс последнего объекта упорядоченного множества:
NSLog( @"%d", [orderedSet indexOfLastObject]);
2016-07-26 15:21:59.854 libtest[4506:609242] 3
Комбинирование и рекомбинирование упорядоченных множеств
Упорядоченные множества на базе класса SCOrderedSet предоставляют следующие методы для осуществления операций комбинирования и рекомбинирования:
- Метод unionOrderedSet: добавляет в исходное упорядоченное множество те объекты из указанного второго упорядоченного множества, которые отсутствуют в исходном упорядоченном множестве. Данная операция также называется объединением множеств. Аналогичным образом (но с коллекцией любого поддерживаемого типа) действует метод unionSet:.
NSLog( @"%@", orderedSet);
NSLog( @"%@", orderedSet);
2016-07-31 11:16:16.240 libtest[11456:2642711] Ordered set count=3: {(
"00",
"02",
"04"
)}
2016-07-31 11:16:16.240 libtest[11456:2642711] Ordered set count=5: {(
"00",
"02",
"04",
"01",
"03"
)}
- Метод minusOrderedSet: удаляет из исходного упорядоченного множества объекты, входящие в указанное упорядоченное множество. Данная операция носит название вычитание множества. Аналогичным образом (но с коллекцией любого поддерживаемого типа) действует метод minusSet:.
NSLog( @"%@", orderedSet);
NSLog( @"%@", orderedSet);
2016-07-31 11:18:32.299 libtest[11487:2645000] Ordered set count=5: {(
"00",
"01",
"02",
"03",
"04"
)}
2016-07-31 11:18:32.299 libtest[11487:2645000] Ordered set count=3: {(
"00",
"02",
"04"
)}
- Метод intersectOrderedSet: оставляет в исходном множестве только объекты, присутствующие во втором упорядоченном множестве. Таким же образом, но с использованием коллекции любого поддерживаемого типа, действует метод intersectSet:.
NSLog( @"%@", orderedSet);
NSLog( @"%@", orderedSet);
2016-07-31 11:24:04.137 libtest[11518:2649148] Ordered set count=5: {(
"00",
"01",
"02",
"03",
"04"
)}
2016-07-31 11:24:04.137 libtest[11518:2649148] Ordered set count=2: {(
"01",
"03"
)}
Словари
Класс SCDictionary определяет программный интерфейс к хранилищу пар "ключ - значение", доступ к которым осуществляется через ключи, в роли которых выступают текстовые строки. В качестве значений могут использоваться экземпляры классов, поддерживающих коллекции.
Создание словарей
Создание словарей с использованием последовательных файлов, словарей и потоков осуществляются следующими классовыми методами класса SCDictionary:
+ (instancetype)dictionaryWithCoder:(NSCoder *)coder;
+ (instancetype)dictionaryWithContentsOfSerializedFile:(NSString *)path;
+ (instancetype)dictionaryWithDataDictionary:(NSDictionary *)dictionary;
+ (instancetype)dictionaryWithDataDictionaryFromFile:(NSString *)path;
+ (instancetype)dictionaryWithStream:(
SCStream *)stream;
+ (instancetype)dictionaryWithFileStream:(NSString *)path;
Создание словарей осуществляется следующими классовыми методами класса SCDictionary:
+ (instancetype)dictionaryWithName:(NSString *)name;
+ (instancetype)dictionaryWithObject:(
id<
SCCollectioning>)object forKey:(NSString *)key;
+ (instancetype)dictionaryWithObjectsAndKeys:(
id<
SCCollectioning>)object, ...;
+ (instancetype)dictionaryWithCollection:(
id<
SCCollection>)collection;
+ (instancetype)dictionaryWithDictionary:(
SCDictionary *)dictionary;
+ (instancetype)dictionary;
- Метод dictionaryWithName: возвращает созданный пустой словарь с указанным названием:
NSLog( @"%@", dictionary);
2016-07-31 22:29:31.434 libtest[12845:2892139] Dictionary "Sample Dictionary" count=0: {
}
- Метод dictionaryWithObject:forKey: создает словарь с указанным объектом для заданного ключа:
NSLog( @"%@", dictionary);
2016-07-31 22:31:19.190 libtest[12864:2893905] Dictionary count=1: {
"System" = "MacOS";
}
- Метод dictionaryWithObject: возвращает словарь с указанным объектом в качестве элемента с автоматически генерируемым ключем:
NSLog( @"%@", dictionary);
2016-07-31 22:32:27.592 libtest[12892:2894987] Dictionary count=1: {
"Key 0" = "1.0.0";
}
- Метод dictionaryWithObjects:forKeya: создает и возвращает словарь, содержащий объекты из указанной коллекции с ключами из заданной коллекции. Коллекции ключей и значений могут быть любого поддерживаемого библиотекой типа:
NSLog( @"%@", dictionary);
2016-07-31 22:36:07.013 libtest[12942:2896819] Dictionary count=2: {
"Version" = "10.11.6";
"System" = "MacOS";
}
- Метод dictionaryWithObjects: возвращает словарь, содержащий объекты из указанного завершаемого нулевым указателем списка. Ключи для данных объектов генерируются автоматически.
NSLog( @"%@", dictionary);
2016-07-31 22:38:11.019 libtest[12966:2898668] Dictionary count=3: {
"Key 0" = "FreeBSD";
"Key 1" = "3.2.0";
"Key 2" = "i386";
}
- Метод dictionaryWithObjectsAndKeys: создает словарь, который содержит объекты и ключи из заданного завершаемого нулевым указателем списка:
NSLog( @"%@", dictionary);
2016-07-31 22:40:06.682 libtest[12988:2900318] Dictionary count=2: {
"Version" = "10.11.6";
"System" = "MacOS";
}
- Метод dictionaryWithCollection: возвращает словарь, содержащий объекты из заданной исходной коллекции любого поддерживаемого типа. Ключи для добавленных объектов генерируются автоматически:
NSLog( @"%@", dictionary);
2016-07-31 22:41:52.728 libtest[13012:2901574] Dictionary count=3: {
"Key 0" = "FreeBSD";
"Key 1" = "3.2.0";
"Key 2" = "i386";
}
- Метод dictionaryWithDictionary: создает копию указанного существующего словаря:
NSLog( @"%@", dictionary);
2016-07-31 22:43:38.354 libtest[13033:2902816] Dictionary count=2: {
"Key 0" = "FreeBSD";
"Key 1" = "i386";
}
- Метод dictionary возвращает пустой неименованный словарь:
NSLog( @"%@", dictionary);
2016-07-31 22:44:44.243 libtest[13049:2903800] Dictionary count=0: {
}
Инициализация словарей
Также в классе SCDictionary объявлен ряд методов инициализации экземпляров класса:
- (instancetype)initWithName:(NSString *)name;
- (instancetype)initWithObject:(
id<
SCCollectioning>)object forKey:(NSString *)key;
- (instancetype)initWithCollection:(<
SCCollection>
id)collection;
- (instancetype)initWithDictionary:(
SCDictionary *)dictionary;
- (instancetype)init;
- Метод initWithName: инициализирует пустой словарь с заданным именем.
- Метод initWithObject:forKey: выполняет инициализацию словаря с одним элементом с заданным объектом и указанным ключем.
- Метод initWithObject: осуществляет инициализацию словаря с одним объектом и автоматически генерируемым ключем.
- Метод initWithObjects:forKeys: возвращает инициализированный словарь с объектами и ключами из указанных коллекций любого поддерживаемого типа.
- Метод initWithObjects: инициализирует словарь с объектами из заданного завершаемого нулевым указателем списка. Ключи объектов генерируются автоматически.
- Метод initWithObjectsAndKeys: выполняет инициализацию объекта на основании завершаемого нулевым указателем списка, нечетные объекты которого становятся объектами словаря, а четные объекты становятся ключами к этим объектам.
- Метод initWithCollection: инициализирует словарь с объектами из указанной коллекции любого поддерживамого типа. Ключи объектов генерируются автоматически.
- Метод initWithDictionary: осуществляет инициализацию словаря в виде копии указанного существующего словаря.
- Метод init инициализирует пустой неименованный словарь.
Копирование словарей
Класс SCDictionary объявляет следующие методы копирования словарей:
- Метод setDictionary: удаляет текущее содержимое и настройки словаря и копирует объекты, ключи и параметры из указанного существующего словаря:
NSLog( @"%@", dictionary);
NSLog( @"%@", dictionary);
2017-03-28 16:41:05.324850 libtest[25097:616641] Dictionary count=2: {
Login = root;
UID = 0
}
2017-03-28 16:41:05.325553 libtest[25097:616641] Dictionary count=2: {
Home = /usr/home/root;
Active = 1
}
Сравнение словарей
Для сравнения словарей класс SCDictionary декларирует следующие методы:
- (BOOL)isEqualToContentsOfDictionary:(
SCDictionary *)dictionary;
- Метод isEqualToDictionary: выполняет сранение параметров и содержимого двух словарей, возвращая значение YES только в том случае, если у сравниваемых словарей одинаковое как содержимое, так и значение параметров (прежде всего имя словаря).
Добавление и изменение объектов словаря
Добавление и изменение объектов и значений словаря в классе SCDictionary выполняют следующие методы:
- Метод setObject:forKey: устанавливает ассоциацию между указанными объектом и ключем. Если запись с указанным ключем в словаре отсутствует, то она создается. Если же запись уже существует, то ранее ассоциированный с ключем объект заменяется на переданный методу в качестве параметра.
NSLog( @"%@", dictionary);
NSLog( @"%@", dictionary);
NSLog( @"%@", dictionary);
2016-08-05 00:15:33.482 libtest[21322:3849202] Dictionary count=0: {
}
2016-08-05 00:15:33.483 libtest[21322:3849202] Dictionary count=2: {
"Version" = "10.11.0";
"System" = "MacOS";
}
2016-08-05 00:15:33.483 libtest[21322:3849202] Dictionary count=2: {
"Version" = "10.11.6";
"System" = "MacOS";
}
- Метод setObjects:forKeys: добавляет в словарь объекты и ключи, содержащиеся в заданных коллекциях любого поддерживаемого типа:
[dictionary setBool:YES forKey:@"Debug"];
NSLog( @"%@", dictionary);
NSLog( @"%@", dictionary);
2016-08-05 12:24:33.413 libtest[21847:3956134] Dictionary count=2: {
"Debug" = "1";
"System" = "FreeBSD";
}
2016-08-05 12:24:33.414 libtest[21847:3956134] Dictionary count=3: {
"Debug" = "NO";
"System" = "MacOS";
"Version" = "10.11.6";
}
- Метод setObjectsAndKeys: добавляет в словарь объекты и ключи из завершаемого нулевым указателем списка. Список обрабатывается по парному принципу - нечетные объекты используются в качестве объектов, четные объекты - в качестве ключей.
NSLog( @"%@", dictionary);
NSLog( @"%@", dictionary);
2016-08-05 12:26:44.280 libtest[21886:3956999] Dictionary count=1: {
"System" = "FreeBSD";
}
2016-08-05 12:26:44.280 libtest[21886:3956999] Dictionary count=2: {
"Version" = "10.11.6";
"System" = "MacOS";
}
- Метод setValue:forKey: устанавливает ассоциацию между указанными значением и ключем. Если пара "ключ-значение" уже существует, то ранее ассоциированное значение заменяется на новое, в противном случае словарь создает новую пару "ключ-значение".
NSLog( @"%@", dictionary);
NSLog( @"%@", dictionary);
NSLog( @"%@", dictionary);
2016-08-05 08:27:05.785 libtest[21648:3943305] Dictionary count=0: {
}
2016-08-05 08:27:05.785 libtest[21648:3943305] Dictionary count=2: {
"Version" = "10.11.0";
"System" = "MacOS";
}
2016-08-05 08:27:05.785 libtest[21648:3943305] Dictionary count=2: {
"Version" = "10.11.6";
"System" = "MacOS";
}
- Метод setValues:forKeys: добавляет в словарь значения и ключи, содержащиеся в заданных коллекциях любого поддерживаемого библиотекой типа:
[dictionary setBool:YES forKey:@"Debug"];
NSLog( @"%@", dictionary);
NSLog( @"%@", dictionary);
2016-08-05 12:25:24.602 libtest[21864:3956609] Dictionary count=2: {
"Debug" = "1";
"System" = "FreeBSD";
}
2016-08-05 12:25:24.602 libtest[21864:3956609] Dictionary count=3: {
"Debug" = "NO";
"System" = "MacOS";
"Version" = "10.11.6";
}
- Метод setValuesAndKeys: добавляет в словарь значения и ключи из завершаемого нулевым указателем списка. Список обрабатывается по парному принципу - нечетные объекты используются в качестве значений, четные объекты - в качестве ключей.
NSLog( @"%@", dictionary);
NSLog( @"%@", dictionary);
2016-08-05 12:26:44.280 libtest[21886:3956999] Dictionary count=1: {
"System" = "FreeBSD";
}
2016-08-05 12:26:44.280 libtest[21886:3956999] Dictionary count=2: {
"Version" = "10.11.6";
"System" = "MacOS";
}
Удаление объектов из словаря
Класс SCDictionary объявляет следующие методы удаления данных:
- (void)removeObjectForKey:(NSString *)key;
- (void)removeObjectsForKeys:(id)keys;
- Метод removeObjectForKey: удаляет из словаря объект или значение, ассоциированные с заданным ключем. Если указанного ключа в словаре не существует, вызов метода игнорируется.
NSLog( @"%@", dictionary);
NSLog( @"%@", dictionary);
2016-08-05 16:55:23.917 libtest[22065:3974032] Dictionary count=4: {
"Version" = "10.11.6";
"Contact" = "samond@mac.com";
"System" = "MacOS";
"Debug" = "0";
}
2016-08-05 16:55:23.917 libtest[22065:3974032] Dictionary count=3: {
"Version" = "10.11.6";
"System" = "MacOS";
"Debug" = "0";
}
- Метод removeObjectsForKeys: удаляет из словаря объекты и значения, ассоциированные с ключами из указанного завершаемого нулевым указателем списка:
NSLog( @"%@", dictionary);
NSLog( @"%@", dictionary);
2016-08-05 16:56:33.868 libtest[22085:3974528] Dictionary count=4: {
"Version" = "10.11.6";
"Contact" = "samond@mac.com";
"System" = "MacOS";
"Debug" = "0";
}
2016-08-05 16:56:33.868 libtest[22085:3974528] Dictionary count=2: {
"Version" = "10.11.6";
"System" = "MacOS";
}
Доступ к ключам и значениям словаря
Нижеприведенные методы класса SCDictionary обеспечивают групповой доступ к ключам и значениям, содержащимся в словаре:
- Свойство allKeys возвращает массив, содержащий все ключи словаря. Для пустого словаря возвращается пустой массив.
NSLog( @"%@", [dictionary allKeys]);
2016-08-04 12:51:33.814 libtest[20119:3757168] Array count=3: (
"Version",
"System",
"Contact"
)
- Свойство allValues возвращет массив всех значений (объектов) словаря. При отсутствии в словаре значений метод возвращает пустой массив.
NSLog( @"%@", [dictionary allValues]);
2016-08-04 12:52:26.829 libtest[20138:3757749] Array count=3: (
"10.11.6",
"MacOS",
"samond@mac.com"
)
- Метод allKeysForObject: формирует и возвращает массив, в котором находятся ключи, ассоциированные в массиве с указанным объектом (один и тот же объект может входить в массив при условии, что каждое вхождение ассоциировано с отдельным ключем). Если запрошенный объект отсутствует в словаре, возвращается пустой массив.
NSLog( @"%@", [dictionary allKeysForObject:@"MacOS"]);
2016-08-04 12:53:49.544 libtest[20163:3758359] Array count=2: (
"System",
"HostName"
)
Для получения объекта, ассоциированного с конкретным ключем, применяется метод objectForKey:. Если словарь не содержит записи с данным ключем, метод возвращает нулевой указатель.
- (id)objectForKey:(NSString *)key;
NSLog( @"%@", [dictionary objectForKey:@"System"]);
NSLog( @"%@", [dictionary objectForKey:@"OS"]);
2016-08-04 13:16:01.573 libtest[20308:3766321] MacOS
2016-08-04 13:16:01.573 libtest[20308:3766321] (null)
Для доступа к значениям, ассоциированным в словаре с заданным ключем используется метод valueForKey:. Если запись с затребованным ключем в словаре отсутствует, то этот метод возвращает пустой указатель.
- (id)valueForKey:(NSString *)key;
NSLog( @"%@", [dictionary valueForKey:@"System"]);
NSLog( @"%@", [dictionary valueForKey:@"OS"]);
2016-08-04 13:24:52.514 libtest[20402:3772023] MacOS
2016-08-04 13:24:52.514 libtest[20402:3772023] (null)
Поиск объектов в словаре
Поиск объектов в словаре осуществляется с помощью следующих методов класса SCDictionary:
- (BOOL)containsObjectForKey:(NSString *)key;
- (BOOL)containsStringForKey:(NSString *)key;
- (BOOL)containsNumberForKey:(NSString *)key;
- Метод containsObjectForKey: возвращает значение YES при наличии в словаре объекта, ассоциированного с указанным в качестве аргумента метода ключе:
[dictionary setBool:NO forKey:@"Debug"];
NSLog( @"%d", [dictionary containsObjectForKey:@"System"]);
NSLog( @"%d", [dictionary containsObjectForKey:@"OS"]);
2016-08-04 13:57:18.504 libtest[20528:3780098] 1
2016-08-04 13:57:18.504 libtest[20528:3780098] 0
- Метод containsStringForKey: определяет наличие в словаре строки с заданным ключем. При наличии такой строки метод возвращает значение YES. Если объекта с таким ключем в словаре не найдено или ассоциированный с ключем объект не является экземпляром класса NSString, то метод возвращает значение NO.
[dictionary setBool:NO forKey:@"Debug"];
NSLog( @"%d", [dictionary containsStringForKey:@"System"]);
NSLog( @"%d", [dictionary containsStringForKey:@"Debug"]);
NSLog( @"%d", [dictionary containsStringForKey:@"Verbose"]);
2016-08-04 13:58:04.605 libtest[20545:3780477] 1
2016-08-04 13:58:04.605 libtest[20545:3780477] 0
2016-08-04 13:58:04.606 libtest[20545:3780477] 0
- Метод containsNumberForKey: действует аналогично методы containsStringForKey:, но только в отношении числовых объектов (экземпляров класса NSNumber):
[dictionary setBool:NO forKey:@"Debug"];
NSLog( @"%d", [dictionary containsNumberForKey:@"System"]);
NSLog( @"%d", [dictionary containsNumberForKey:@"Debug"]);
NSLog( @"%d", [dictionary containsNumberForKey:@"TimeStamp"]);
2016-08-04 14:03:12.392 libtest[20617:3782577] 0
2016-08-04 14:03:12.392 libtest[20617:3782577] 1
2016-08-04 14:03:12.392 libtest[20617:3782577] 0
- Метод containsAnyObjectForKeys: возвращает значение YES если в словаре имеется хотя бы один объект, ассоциированный с ключами из передаваемой методу в качестве аргумента коллекции любого поддерживаемого библиотекой типа:
[dictionary setBool:NO forKey:@"Debug"];
NSLog( @"%d", [dictionary containsAnyObjectForKeys:keys]);
[keys removeObject:@"System"];
NSLog( @"%d", [dictionary containsAnyObjectForKeys:keys]);
2016-08-04 14:00:16.888 libtest[20573:3781382] 1
2016-08-04 14:00:16.888 libtest[20573:3781382] 0
- Метод containsAllObjectsForKeys: возвращает значение YES если словарь содержит объекты, ассоциированные со всеми ключами из указанной коллекции любого поддерживаемого библиотекой типа:
[dictionary setBool:NO forKey:@"Debug"];
NSLog( @"%d", [dictionary containsAllObjectsForKeys:keys]);
[keys addObject:@"Verbose"];
NSLog( @"%d", [dictionary containsAllObjectsForKeys:keys]);
2016-08-04 14:01:25.290 libtest[20593:3781974] 1
2016-08-04 14:01:25.291 libtest[20593:3781974] 0
Счетчики словарей
Свойство keyEnumerator возвращает экземпляр класса NSEnumerator, дающий программисту возможность получить доступ к списку содержащихся в словаре ключей:
- (NSEnumerator *)keyEnumerator;
[dictionary setBool:NO forKey:@"Debug"];
NSString *key;
while ( ( key = keys.nextObject)) {
NSLog( @"%@: %@", key, object);
}
2016-08-04 14:45:46.853 libtest[20808:3795367] Version: 10.11.6
2016-08-04 14:45:46.853 libtest[20808:3795367] System: MacOS
2016-08-04 14:45:46.853 libtest[20808:3795367] Debug: 0
Стеки
Стеки являются отдельным видом коллекций, представляющим собой список объектов, организованных по принципу LIFO (last in - first out, "последним пришел - первым вышел"). Стек предоставляет доступ только к объекту, добавленному в него последним. Для доступа к остальным объектам необходимо удалить из стека все ранее добавленные объекты.
Создание стеков
Создание стеков из последовательных файлов, словарей и потоков осуществляется с использованием следующих методов класса SCStack:
+ (instancetype)stackWithCoder:(NSCoder *)coder;
+ (instancetype)stackWithContentsOfSerializedFile:(NSString *)path;
+ (instancetype)stackWithDataDictionary:(NSDictionary *)dictionary;
+ (instancetype)stackWithDataDictionaryFromFile:(NSString *)path;
+ (instancetype)stackWithStream:(
SCStream *)stream;
+ (instancetype)stackWithFileStream:(NSString *)path;
Для создания стеков класс SCStack объявляет следующие классовые методы:
+ (instancetype)stackWithName:(NSString *)name;
+ (instancetype)stackWithCollection:(
id<
SCCollection>)collection;
+ (instancetype)stackWithStack:(
SCStack *)stack;
+ (instancetype)stack;
- Классовый метод stackWithName: создает пустой стек с указанным именем:
2016-08-07 10:22:11.523 libtest[45278:4351145] Stack "Advanced Stack" count=0: (
)
- Классовый метод stackWithObject: возвращает созданный неименованный стек, содержащий заданный аргументом метода объект:
2016-08-07 10:23:02.282 libtest[45295:4351565] Stack count=1: (
"Object 00"
)
- Классовый метод stackWithObjects: создает и возвращает стек, содержащий объекты из заданного списка, завершаемого нулевым указателем. Объекты добавляются в стек в соответствии с порядком их перечисления в списке.
2016-08-07 10:23:46.577 libtest[45311:4351840] Stack count=3: (
"Object 02",
"Object 01",
"Object 00"
)
- Классовый метод stackWithCollection: возвращает стек, содержащий объекты из указанной коллекции любого поддерживаемого типа. Порядок добавления объектов зависит от типа исходной коллекции.
2016-08-07 10:25:00.898 libtest[45330:4352207] Stack count=3: (
"Object 02",
"Object 01",
"Object 00"
)
- Классовый метод stackWithStack: создает копию существующего стека:
2016-08-07 10:25:59.898 libtest[45348:4352568] Stack count=3: (
"Object 02",
"Object 01",
"Object 00"
)
- Классовый метод stack возвращает пустой неименованный стек:
2016-08-07 10:26:45.940 libtest[45364:4352857] Stack count=0: (
)
Инициализация стеков
Класс SCStack декларирует следующие методы инициализации экземпляров класса:
- (instancetype)initWithName:(NSString *)name;
- (instancetype)initWithCollection:(
id<
SCCollection>)collection;
- (instancetype)initWithStack:(
SCStack *)stack;
- (instancetype)init;
- Метод initWithName: инициализирует пустой стек с указанным именем.
- Метод initWithObject: выполняет инициализацию неименованного стека с указанным в качестве аргумента метода объектом.
- Метод initWithObjects: возвращает инициализированный неименованный стек, в который добавлены объекты из заданного завершаемого нулевым указателем списка. Порядок добавления объектов в стек соответствует порядку перечисления объектов в списке.
- Метод initWithCollection: осуществляет инициализацию неименованного стека с добавлением в него объектов из указанной коллекции любого поддерживаемого типа. Порядок добавления объектов в инициализируемый стек зависит от типа исходной коллекции.
- Метод initWithStack: инициализирует копию указанного существующего стека.
- Метод stack возвращает инициализированный пустой неименованный стек.
Копирование стеков
Класс SCStack объявляет следующие методы копирования стеков:
- Метод setStack: удаляет текущее содержимое и настройки стека и копирует объекты и параметры из указанного существующего стека:
NSLog( @"%@", stack);
NSLog( @"%@", source);
NSLog( @"%@", stack);
2017-03-30 11:55:47.856062 libtest[55427:2008281] Stack count=3: (
300,
200,
100
)
2017-03-30 11:55:47.856277 libtest[55427:2008281] Stack count=2: (
500,
400
)
2017-03-30 11:55:47.856515 libtest[55427:2008281] Stack count=2: (
500,
400
)
Сравнение стеков
Для сравнения стеков класс SCStack декларирует следующие методы:
- (BOOL)isEqualToStack:(
SCStack *)stack;
- (BOOL)isEqualToContentsOfStack:(
SCStack *)stack;
- Метод isEqualToStack: выполняет сранение параметров и содержимого двух стеков, возвращая значение YES только в том случае, если у сравниваемых стеков одинаковое как содержимое, так и значение параметров (прежде всего имя стека).
Добавление объектов в стек
Класс SCStack для размещения объектов в стеке декларирует следующие методы:
- Метод pushObject: добавляет в стек указанный объект:
NSLog( @"%@", stack);
NSLog( @"%@", stack);
2016-08-08 13:59:53.763 libtest[47019:4678950] Stack count=2: (
"Object 01",
"Object 00"
)
2016-08-08 13:59:53.763 libtest[47019:4678950] Stack count=3: (
"Object 02",
"Object 01",
"Object 00"
)
- Метод pushObjects: добавляет в стек объекты из указанного завершаемого нулевым указателем списка. Объекты добавляются в стек в порядке их объявления в списке, то есть после завершения работы метода последним добавленным объектом в стеке будет объявленный последним в списке объект.
NSLog( @"%@", stack);
NSLog( @"%@", stack);
2016-08-08 14:02:00.911 libtest[47048:4679594] Stack count=2: (
"Object 01",
"Object 00"
)
2016-08-08 14:02:00.911 libtest[47048:4679594] Stack count=4: (
"Object 14",
"Object 12",
"Object 01",
"Object 00"
)
- Метод pushCollection: добавляет в стек объекты из заданной коллекции любого поддерживаемого библиотекой типа. Порядок добавления объектов зависит от типа исходной коллекции.
NSLog( @"%@", stack);
NSLog( @"%@", stack);
2016-08-08 14:08:10.340 libtest[47111:4681475] Stack count=2: (
"Object 01",
"Object 00"
)
2016-08-08 14:08:10.340 libtest[47111:4681475] Stack count=4: (
"Object 22",
"Object 21",
"Object 01",
"Object 00"
)
Извлечение объектов из стека
Для извлечения объектов из стека класс SCStack реализует следующие методы:
- (void)pop;
- (id)popObject;
- Метод pop извлекает из стека последний добавленный в него объект. При этом извлеченный из стека объект удаляется.
NSLog( @"%@", stack);
NSLog( @"%@", stack);
2016-08-08 15:28:01.178 libtest[47442:4709867] Stack count=3: (
"Object 02",
"Object 01",
"Object 00"
)
2016-08-08 15:28:01.178 libtest[47442:4709867] Stack count=2: (
"Object 01",
"Object 00"
)
- Метод popObject извлекает из стека последний добавленный в него объект и возвращает извлеченный объект в вызвавший метод код. Если стек не содержит ни одного объекта, метод возвращает нулевой указатель.
NSLog( @"%@", stack);
NSLog( @"%@", [stack popObject]);
NSLog( @"%@", stack);
2016-08-08 15:29:48.354 libtest[47465:4710481] Stack count=3: (
"Object 02",
"Object 01",
"Object 00"
)
2016-08-08 15:29:48.354 libtest[47465:4710481] Object 02
2016-08-08 15:29:48.354 libtest[47465:4710481] Stack count=2: (
"Object 01",
"Object 00"
)
Удаление объектов из стека
В дополнение к методу pop класс объявляет метод removeTopObject, выполняющий аналогичную функцию. Данный метод введен для логической совместимости с остальными классами коллекций.
Копирование объектов стека
Метод duplicateTopObject дублирует объект, находящийся на вершине стека, то есть последний добавленный объект:
- (void)duplicateTopObject;
NSLog( @"%@", stack);
NSLog( @"%@", stack);
2016-08-08 16:13:06.619 libtest[47645:4720857] Stack count=2: (
"Object 01",
"Object 00"
)
2016-08-08 16:13:06.619 libtest[47645:4720857] Stack count=3: (
"Object 01",
"Object 01",
"Object 00"
)
Доступ к объектам стека
Стек поддерживает прямой доступ только к последнему добавленному в него объекту. Чтобы получить такой доступ, необходимо использовать один из следующих методов класса SCStack:
- Свойство topObject возвращает указатель на последний добавленный в стек объект. Если данный метод вызывается для пустого стека, то возвращается пустой указатель.
NSLog( @"%@", [stack topObject]);
2016-08-07 13:58:44.040 libtest[45607:4375547] Object 02
Очереди
Очередь - вид коллекции, работающей по принципу FIFO (first in - first out, первым пришел - первым ушел). Добавление объектов всегда осуществляется в конец очереди, а извлечение объектов выполняется из начала очереди. Произвольный доступ к объектам, за исключением первого и последнего, очереди не предоставляют, также как не поддерживают изменение порядка следования объектов в очереди.
Реализацию очередей выполняет класс SCQueue, являющийся дочерним для класса SCCollection. Для добавления объектов в очередь применяются унаследованные от класса SCCollection методы добавления, описанные в соответствующем разделе документации.
Создание очередей
Создание очередей из последовательных файлов, словарей и потоков осуществляется следующими классовыми методами:
+ (instancetype)queueWithCoder:(NSCoder *)coder;
+ (instancetype)queueWithContentsOfSerializedFile:(NSString *)path;
+ (instancetype)queueWithDataDictionary:(NSDictionary *)dictionary;
+ (instancetype)queueWithDataDictionaryFromFile:(NSString *)path;
+ (instancetype)queueWithStream:(
SCStream *)stream;
+ (instancetype)queueWithFileStream:(NSString *)path;
Класс SCQueue объявляет следующие методы создания очередей:
+ (instancetype)queueWithName:(NSString *)name;
+ (instancetype)queueWithCollection:(
id<
SCCollection>)collection;
+ (instancetype)queueWithQueue:(
SCQueue *)queue;
+ (instancetype)queue;
- Классовый метод queueWithName: создает пустую очередь с заданным именем:
2016-08-08 16:54:15.731 libtest[47909:4739817] Queue "Messages Queue" count=0:
)
- Классовый метод queueWithObject: возвращает созданную неименованную очередь с указанным в качестве аргумента метода объектом:
2016-08-08 16:54:50.815 libtest[47924:4740064] Queue count=1: (
"Object 00"
)
- Классовый метод queueWithObjects: создает и возвращает неименованную очередь с объектами из указанного списка, завершаемого нулевым указателем:
2016-08-08 16:56:01.790 libtest[47948:4740963] Queue count=3: (
"Object 00",
"Object 01",
"Object 02"
)
- Классовый метод queueWithCollection: возвращает созданную очередь с объектами из заданной существующей коллекции любого поддерживаемого типа:
2016-08-08 16:56:56.096 libtest[47967:4741510] Queue count=3: (
"Object 00",
"Object 01",
"Object 02"
)
- Классовый метод queueWithQueue: создает копию указанной существующей очереди:
2016-08-08 16:57:55.687 libtest[47987:4742229] Queue count=3: (
"Object 00",
"Object 01",
"Object 02"
)
- Классовый метод queue возвращает созданную пустую неименованную очередь:
2016-08-08 16:58:41.636 libtest[48005:4742776] Queue count=0:
)
Инициализация очередей
Класс SCQueue объявляет следующие методы инициализации:
- (instancetype)initWithName:(NSString *)name;
- (instancetype)initWithCollection:(
id<
SCCollection>)collection;
- (instancetype)initWithQueue:(
SCQueue *)queue;
- (instancetype)init;
- Метод initWithName: инициализирует пустую очередь с указанным именем.
- Метод initWithObject: возвращает инициализированную неименованную очередь с заданным в качестве параметра метода объектом.
- Метод initWithObjects: выполняет инициализацию неименованной очереди с объектами из заданного списка, завершаемого нулевым указателем.
- Метод initWithCollection: возвращает инициализированную очередь с объектами из указанной существующей коллекцией любого поддерживаемого библиотекой типа.
- Метод initWithQueue: инициализирует копию существующей очереди.
- Метод init возвращает инициализированную пустую неименованную очередь.
Копирование очередей
Класс SCQueue объявляет следующие методы копирования очередей:
- Метод setQueue: удаляет текущее содержимое и настройки очереди и копирует объекты и параметры из указанной существующей очереди:
NSLog( @"%@", queue);
NSLog( @"%@", source);
NSLog( @"%@", queue);
2017-03-30 14:01:59.326567 libtest[59102:2087306] Queue count=3: (
100,
200,
300
)
2017-03-30 14:01:59.326707 libtest[59102:2087306] Queue count=2: (
400,
500
)
2017-03-30 14:01:59.326899 libtest[59102:2087306] Queue count=2: (
400,
500
)
Сравнение очередей
Для сравнения очередей класс SCQueue декларирует следующие методы:
- (BOOL)isEqualToQueue:(
SCQueue *)queue;
- (BOOL)isEqualToContentsOfQueue:(
SCQueue *)queue;
- Метод isEqualToQueue: выполняет сранение параметров и содержимого двух очередей, возвращая значение YES только в том случае, если у сравниваемых очередей одинаковое как содержимое, так и значение параметров (прежде всего имя очереди).
Извлечение объектов из очереди
Метод getObject удаляет из очереди первый объект и возвращает на него указатель. Если метод вызван для пустой очереди, то он возвращает пустой указатель.
NSLog( @"%@", queue);
NSLog( @"=====");
id object;
while ( ( object = [queue getObject])) NSLog( @"=> %@", object);
NSLog( @"=====");
NSLog( @"%@", queue);
2016-08-08 17:01:45.115 libtest[48091:4744307] Queue count=3: (
"Object 00",
"Object 01",
"Object 02"
)
2016-08-08 17:01:45.115 libtest[48091:4744307] =====
2016-08-08 17:01:45.115 libtest[48091:4744307] => Object 00
2016-08-08 17:01:45.115 libtest[48091:4744307] => Object 01
2016-08-08 17:01:45.116 libtest[48091:4744307] => Object 02
2016-08-08 17:01:45.116 libtest[48091:4744307] =====
2016-08-08 17:01:45.116 libtest[48091:4744307] Queue count=0:
)
Удаление объектов из очереди
Для удаления объектов из очереди класс SCQueue декларирует следующие методы:
- (void)removeFirstObject;
- (void)removeLastObject;
- Метод removeFirstObject удаляет из очереди первый в ней объект:
NSLog( @"%@", queue);
NSLog( @"%@", queue);
2016-08-08 17:02:37.092 libtest[48110:4744887] Queue count=3: (
"Object 00",
"Object 01",
"Object 02"
)
2016-08-08 17:02:37.093 libtest[48110:4744887] Queue count=2: (
"Object 01",
"Object 02"
)
- Метод removeLastObject удаляет последний объект в очереди:
NSLog( @"%@", queue);
NSLog( @"%@", queue);
2016-08-08 17:03:27.404 libtest[48128:4745607] Queue count=3: (
"Object 00",
"Object 01",
"Object 02"
)
2016-08-08 17:03:27.404 libtest[48128:4745607] Queue count=2: (
"Object 00",
"Object 01"
)
Копирование объектов очереди
Класс SCQueue объявляет следующие методы для копирования объектов очереди:
- (void)duplicateFirstObject;
- (void)duplicateLastObject;
- Метод duplicateFirstObject дублирует первый объект очереди:
NSLog( @"%@", queue);
NSLog( @"%@", queue);
2016-08-08 17:04:19.267 libtest[48146:4746333] Queue count=2: (
"Object 00",
"Object 01"
)
2016-08-08 17:04:19.267 libtest[48146:4746333] Queue count=3: (
"Object 00",
"Object 00",
"Object 01"
)
- Метод duplicateLastObject создает копию последнего объекта в очереди:
NSLog( @"%@", queue);
NSLog( @"%@", queue);
2016-08-08 17:05:14.758 libtest[48165:4747135] Queue count=2: (
"Object 00",
"Object 01"
)
2016-08-08 17:05:14.758 libtest[48165:4747135] Queue count=3: (
"Object 00",
"Object 01",
"Object 01"
)
Доступ к объектам очереди
Для доступа к объектам в очереди класс SCQueue объявляет следующие методы:
- Свойство firstObject возвращает указатель на первый объект очереди или нулевой указатель для пустой очереди:
NSLog( @"%@", [queue firstObject]);
2016-08-08 16:59:36.435 libtest[48023:4743141] Object 00
Однонаправленные списки
Однонаправленные списки - разновидность коллекций, хранящих данные в форме, при которой информация о следующем объекте хранится вместе с текущим. То есть, доступ к соответствующему объекту возможен только после обработки всех предшестующих ему объектов. Новые объекты добавляются в конец списка. При работе с однонаправленным списком возможен проход только в одном направлении - от предыдущего к следующему (отсюда и название данного вида коллекций).
Работа с объектами однонаправленного списка ограничена доступом к первому объекту списка и к текущему объекту списка (то есть объекту, на который в настоящее время указывает указатель текущего объекта).
Создание однонаправленных списков
Создание однонаправленных списков на основании данных из последовательных файлов, словарей и потоков осуществляется классовыми методами класса SCUnidirectionalList:
+ (instancetype)listWithCoder:(NSCoder *)coder;
+ (instancetype)listWithContentsOfSerializedFile:(NSString *)path;
+ (instancetype)listWithDataDictionary:(NSDictionary *)dictionary;
+ (instancetype)listWithDataDictionaryFromFile:(NSString *)path;
+ (instancetype)listWithStream:(
SCStream *)stream;
+ (instancetype)listWithFileStream:(NSString *)path;
Для создания экземпляров класса декларируются следующие методы:
+ (instancetype)listWithName:(NSString *)name;
+ (instancetype)listWithCollection:(
id<
SCCollection>)collection;
+ (instancetype)listWithList:(
SCList *)list;
+ (instancetype)list;
- Классовый метод listWithName: создает пустой однонаправленный список с указанным именем:
2016-08-17 16:48:55.745 libtest[1257:72812] List "Users List" count=0:
)
Current object: "(null)"
- Классовый метод listWithObject: осуществляет создание неименованного однонаправленного списка с заданным объектом. Указатель текущего объекта устанавливается на заданный в качестве аргумента метода объект.
2016-08-17 16:49:29.233 libtest[1272:73184] List count=1: (
"00"
)
Current object: "00"
- Классовый метод listWithObjects: создает и возвращает неименованный однонаправленный список с объектами из указанного завершаемого нулевым указателем списка. Указатель текущего объекта устанавливается на первый объект из списка.
2016-08-17 16:50:24.808 libtest[1289:73611] List count=3: (
"00",
"01",
"02"
)
Current object: "00"
- Классовый метод listWithCollection: возвращает созданный неименованный однонаправленный список с объектами из заданной коллекции любого поддерживаемого библиотекой типа. Порядок добавления объектов зависит от типа коллекции. Указатель текущего объекта устанавливается на первый добавленный из коллекции объект.
2016-08-17 16:51:42.754 libtest[1321:74808] List count=3: (
"00",
"02",
"04"
)
Current object: "00"
- Классовый метод listWithList: создает копию существующего списка:
2016-08-17 17:03:20.879 libtest[1482:79592] List count=3: (
"01",
"03",
"05"
)
Current object: "01"
- Классовый метод list возвращает созданный неименованный пустой однонаправленный список:
2016-08-17 17:04:07.385 libtest[1502:80085] List count=0:
)
Current object: "(null)"
Инициализация однонаправленных списков
Класс SCUnidirectionalLisr декларирует следующие методы инициализации экземпляров класса:
- (instancetype)initWithName:(NSString *)name;
- (instancetype)initWithCollection:(
id<
SCCollection>)collection;
- (instancetype)initWithList:(
SCList *)list;
- (instancetype)init;
- Метод initWithName: инициализирует пустой однонаправленный список с заданным именем.
- Метод initWithObject: выполняет инициализацию неименованного однонаправленного списка с единственным объектом, указанным в качестве аргумента метода.
- Метод initWithObjects: возвращает инициализированный неименованный однонаправленный список с объектами из переданного списка, завершаемого нулевым указателем.
- Метод initWithCollection: инициализирует однонаправленный список с объектами из указанной коллекции любого поддерживаемого библиотекой списка.
- Метод initWithList: выполняет инициализацию копии указанного существующего списка.
- Метод list инициализирует пустой неименованный однонаправленный список.
Доступ к объектам списка
Класс SCUnidirectionalList объявляет следующие основные методы доступа к объектам однонаправленного списка:
- (id)currentObject;
- (id)firstObject;
- Свойство currentObject возвращает указатель на текущий объект однонаправленного списка. Для пустого списка свойство возвращает нулевой указатель.
NSLog( @"%@", [list currentObject]);
2016-08-17 17:08:08.890 libtest[1546:81133] 00
- Свойство firstObject возвращает указатель на первый объект однонаправленного списка. Для пустого списка метод возвращает нулевой указатель.
NSLog( @"%@", [list firstObject]);
2016-08-17 17:09:39.822 libtest[1569:81681] 00
Копирование списков
Класс SCUnidirectionalList объявляет следующие методы копирования очередей:
- (void)setList:(
SCList *)list;
- Метод setList: удаляет текущее содержимое и настройки списка и копирует объекты и параметры из указанного существующего списка:
NSLog( @"%@", list);
NSLog( @"%@", source);
NSLog( @"%@", list);
2017-03-30 16:27:39.024150 libtest[64020:2189070] List count=3: (
100,
200,
300
)
Current object:100
2017-03-30 16:27:39.024301 libtest[64020:2189070] List count=2: (
400,
500
)
Current object:400
2017-03-30 16:27:39.024467 libtest[64020:2189070] List count=2: (
400,
500
)
Current object:400
Сравнение списков
Для сравнения очередей класс SCUnidirectionalList декларирует следующие методы:
- (BOOL)isEqualToList:(
SCList *)list;
- (BOOL)isEqualToContentsOfList:(
SCList *)list;
- Метод isEqualToList: выполняет сранение параметров и содержимого двух списков, возвращая значение YES только в том случае, если у сравниваемых списков одинаковое как содержимое, так и значение параметров (прежде всего имя списка).
Управление списком
Класс SCUnidirectionalList декларирует следующие методы управления однонаправленными списками:
Метод nextObject переводит указатель текущего объекта на следующий объект списка. Если текущий объект был последним в списке, указатель не переводится.
NSLog( @"%@", [list currentObject]);
NSLog( @"%@", [list nextObject]);
NSLog( @"%@", [list currentObject]);
2016-08-17 17:30:22.533 libtest[1619:86864] 00
2016-08-17 17:30:22.533 libtest[1619:86864] 01
2016-08-17 17:30:22.533 libtest[1619:86864] 01
Добавление объектов в список
Для вставки объектов перед текущим класс SCUnidirectionalList объявляет следующие методы:
- (void)insertCurrentCollection:(
id<
SCCollection>)collection;
- Метод insertCurrentObject: вставляет указанный объект перед текущим объектом списка и устанавливает на него указатель текущего объекта:
NSLog( @"%@", list);
NSLog( @"%@", list);
2016-08-17 17:37:10.634 libtest[1687:88990] List count=3: (
"00",
"01",
"02"
)
Current object: "01"
2016-08-17 17:37:10.635 libtest[1687:88990] List count=4: (
"00",
"03",
"01",
"02"
)
Current object: "03"
- Метод insertCurrentObjects: вставляет объекты из заданного завершаемого нулевым указателем списка перед текущим элементом однонаправленного списка. Указатель текущего элемента устанавливается на последний объект из списка.
NSLog( @"%@", list);
NSLog( @"%@", list);
2016-08-17 17:38:58.348 libtest[1712:89680] List count=3: (
"00",
"01",
"02"
)
Current object: "01"
2016-08-17 17:38:58.348 libtest[1712:89680] List count=5: (
"00",
"04",
"03",
"01",
"02"
)
Current object: "04"
- Метод insertCurrentCollection: вставляет перед текущим элементом списка объекты из заданной коллекции любого поддерживаемого библиотекой списка. Указатель текущего объекта устанавливается на последний добавленный элемент.
NSLog( @"%@", list);
NSLog( @"%@", list);
2016-08-17 17:40:19.814 libtest[1734:90084] List count=3: (
"00",
"01",
"02"
)
Current object: "01"
2016-08-17 17:40:19.815 libtest[1734:90084] List count=5: (
"00",
"06",
"05",
"01",
"02"
)
Current object: "06"
Класс SCUnidirectionalList декларирует следующие методы для вставки объектов в начало списка:
- Метод insertFirstObject: вставляет указанный объект в начало однонаправленного списка:
NSLog( @"%@", list);
NSLog( @"%@", list);
2016-08-17 17:47:38.927 libtest[1814:92616] List count=3: (
"00",
"01",
"02"
)
Current object: "00"
2016-08-17 17:47:38.927 libtest[1814:92616] List count=4: (
"04",
"00",
"01",
"02"
)
Current object: "00"
- Метод insertFirstObjects: вставляет в начало однонаправленного списка объекты из указанного завершаемого нулевым указателем списка:
NSLog( @"%@", list);
NSLog( @"%@", list);
2016-08-17 17:49:19.917 libtest[1834:93303] List count=3: (
"00",
"01",
"02"
)
Current object: "00"
2016-08-17 17:49:19.917 libtest[1834:93303] List count=5: (
"06",
"05",
"00",
"01",
"02"
)
Current object: "00"
- Метод insertFirstCollection: вставляет в начало однонаправленного списка объекты из указанной коллекции любого поддерживаемого библиотекой типа:
NSLog( @"%@", list);
NSLog( @"%@", list);
2016-08-17 17:50:48.104 libtest[1857:93743] List count=3: (
"00",
"01",
"02"
)
Current object: "00"
2016-08-17 17:50:48.105 libtest[1857:93743] List count=5: (
"08",
"07",
"00",
"01",
"02"
)
Current object: "00"
Удаление объектов из списка
Удаление объектов из однонаправленных списков осуществляется следующими методами класса:
- (void)removeCurrentObject;
- (void)removeFirstObject;
- Метод removeCurrentObject удаляет из однонаправленного списка текущий объект и передвигает указатель на следующий за удаленным элемент. Если удаленный элемент был последним в списке, то указатель перемещается на предыдущий объект.
NSLog( @"%@", list);
NSLog( @"%@", list);
2016-08-17 17:54:09.801 libtest[1897:94758] List count=3: (
"00",
"01",
"02"
)
Current object: "01"
2016-08-17 17:54:09.801 libtest[1897:94758] List count=2: (
"00",
"02"
)
Current object: "02"
- Метод removeFirstObject удаляет первый объект однонаправленного списка:
NSLog( @"%@", list);
NSLog( @"%@", list);
2016-08-17 17:55:02.735 libtest[1913:95019] List count=3: (
"00",
"01",
"02"
)
Current object: "00"
2016-08-17 17:55:02.735 libtest[1913:95019] List count=2: (
"01",
"02"
)
Current object: "01"
Замена объектов в списке
Класс SCUnidirectionalList предоставляет методы, позволяющие заменить текущий или первый объект списка:
- Метод replaceCurrentObjectWithObject: заменяет текущий объект однонаправленного списка на заданный объект:
NSLog( @"%@", list);
NSLog( @"%@", list);
2016-08-17 18:00:11.420 libtest[1960:96364] List count=3: (
"00",
"01",
"02"
)
Current object: "01"
2016-08-17 18:00:11.420 libtest[1960:96364] List count=3: (
"00",
"==",
"02"
)
Current object: "=="
- Метод replaceFirstObjectWithObject: осуществляет замену первого объекта однонаправленного списка на указанный объект:
NSLog( @"%@", list);
NSLog( @"%@", list);
2016-08-17 18:02:52.234 libtest[1992:97171] List count=3: (
"00",
"01",
"02"
)
Current object: "01"
2016-08-17 18:02:52.234 libtest[1992:97171] List count=3: (
"==",
"01",
"02"
)
Current object: "01"
Копирование объектов списка
Для удаления объектов класс SCUnidirectionalList объявляет следующие методы:
- (void)duplicateCurrentObject;
- (void)duplicateFirstObject;
- Метод duplicateCurrentObject дублирует текущий объект однонаправленного списка:
NSLog( @"%@", list);
NSLog( @"%@", list);
2016-08-17 18:19:10.908 libtest[2046:103631] List count=3: (
"00",
"01",
"02"
)
Current object: "01"
2016-08-17 18:19:10.908 libtest[2046:103631] List count=4: (
"00",
"01",
"01",
"02"
)
Current object: "01"
- Метод duplicateFirstObject создает копию первого объекта однонаправленного списка:
NSLog( @"%@", list);
NSLog( @"%@", list);
2016-08-17 18:20:06.287 libtest[2064:103904] List count=3: (
"00",
"01",
"02"
)
Current object: "01"
2016-08-17 18:20:06.287 libtest[2064:103904] List count=4: (
"00",
"00",
"01",
"02"
)
Current object: "01"
Двунаправленные списки
Двунаправленный список во многом аналогичен однонаправленному списку, однако указатель в нем может смещаться в обоих направлениях (как от начала к концу списка, так и от конца списка к его началу), а не в одном, как у однонаправленного списка. Кроме этого, двунаправленный список предоставляет доступ к последнему объекту списка. Также в данном разделе мы приведем описание методов, объявленных непосредственно в классе SCBidirectionalList.
Создание двунаправленных списков
Для создания двунаправленных списков на основе данных из последовательных файлов, словарей и потоков класс SCBidirectionalList объявляет следующие классовые методы:
+ (instancetype)listWithCoder:(NSCoder *)coder;
+ (instancetype)listWithContentsOfSerializedFile:(NSString *)path;
+ (instancetype)listWithDataDictionary:(NSDictionary *)dictionary;
+ (instancetype)listWithDataDictionaryFromFile:(NSString *)path;
+ (instancetype)listWithStream:(
SCStream *)stream;
+ (instancetype)listWithFileStream:(NSString *)path;
Создание экземпляров двунаправленных списков может быть осуществлено с использованием любого из декларированных классовых методов:
+ (instancetype)listWithName:(NSString *)name;
+ (instancetype)listWithCollection:(
id<
SCCollection>)collection;
+ (instancetype)listWithList:(
SCList *)list;
+ (instancetype)list;
- Классовый метод listWithName: создает пустой двунаправленный список с заданным именем:
2016-08-17 20:55:53.490 libtest[3072:178010] List "Secret List" count=0:
)
Current object: "(null)"
- Классовый метод listWithObject: возвращает созданный неименованный двунаправленный список с указанным в качестве аргумента метода объектом:
2016-08-17 20:56:48.334 libtest[3087:178288] List count=1: (
"00"
)
Current object: "00"
- Классовый метод listWithObjects: создает и возвращает неименованный двунаправленный список с объектами из заданного завершаемого нулевым указателем списка:
2016-08-17 20:57:29.210 libtest[3103:178526] List count=3: (
"00",
"01",
"02"
)
Current object: "00"
- Классовый метод listWithCollection: создает неименованный двунаправленный список с объектами из указанной коллекции любого поддерживаемого библиотекой типа:
2016-08-17 20:58:41.309 libtest[3124:179032] List count=3: (
"00",
"02",
"04"
)
Current object: "00"
- Классовый метод listWithList: возвращает копию существующего списка:
2016-08-17 20:59:53.348 libtest[3144:179440] List count=3: (
"01",
"03",
"05"
)
Current object: "01"
- Классовый метод list создает и возвращает пустой неименованный двунаправленный список:
2016-08-17 21:00:54.044 libtest[3160:179758] List count=0:
)
Current object: "(null)"
Инициализация двунаправленных списков
Класс SCBidirectionalList декларирует следующие методы инициализации экземпляров класса:
- (instancetype)initWithName:(NSString *)name;
- (instancetype)initWithCollection:(
id<
SCCollection>)collection;
- (instancetype)initWithList:(
SCList *)list;
- (instancetype)init;
- Метод initWithName: инициализирует пустой двунаправленный список с заданным именем.
- Метод initWithObject: выполняет инициализацию неименованного двунаправленного списка с указанным в качестве аргумента метода объекта.
- Метод initWithObjects: осуществляет инициализацию неименованного двунаправленного списка с объектами из заданного завершаемого нулевым указателем исходного списка.
- Метод initWithCollection: возвращает инициализированный неименованный двунаправленный список с объектами из указанной коллекции любого поддерживаемого библиотекой типа.
- Метод initWithList: инициализирует копию указанного существующего двунаправленного списка.
- Метод init возвращает инициализированный пустой неименованный двунаправленный список.
Доступ к объектам списка
Доступ к объектам двунаправленного списка обеспечивают методы:
Свойство lastObject возвращает указатель на последний объект двунаправленного списка. Если список пуст, свойство возвращает пустой указатель.
Управление списком
Для управления двунаправленными списками класс декларирует следующие методы:
Метод previousObject передвигает указатель текущего объекта на предыдущий элемент списка и возвращает указатель на новый текущий объект. Если метод вызван для первого объекта списка, то метод возвращает нулевой указатель, но не меняет указатель текущего объекта:
do { } while ( [list nextObject]);
do {
NSLog( @"%@", [list currentObject]);
} while ( [list previousObject]);
2016-08-17 21:07:59.306 libtest[3279:182111] 02
2016-08-17 21:07:59.306 libtest[3279:182111] 01
2016-08-17 21:07:59.306 libtest[3279:182111] 00
Добавление объектов в список
Для добавления объектов класс SCBidirectionalList декларирует методы:
- Метод insertLastObject: вставляет указанный объект перед последним объектом двунаправленного списка:
NSLog( @"%@", list);
NSLog( @"%@", list);
2016-08-17 21:10:08.437 libtest[3308:182901] List count=3: (
"00",
"01",
"02"
)
Current object: "00"
2016-08-17 21:10:08.437 libtest[3308:182901] List count=4: (
"00",
"01",
"==",
"02"
)
Current object: "00"
- Метод insertLastObjects: вставляет объекты из указанного завершаемого пустым указателем списка перед последним объектом двунаправленного списка:
NSLog( @"%@", list);
NSLog( @"%@", list);
2016-08-17 21:11:11.681 libtest[3326:183211] List count=3: (
"00",
"01",
"02"
)
Current object: "00"
2016-08-17 21:11:11.681 libtest[3326:183211] List count=5: (
"00",
"01",
"==",
"--",
"02"
)
Current object: "00"
- Метод insertLastCollection: вставляет перед последним объектом двунаправленного списка объекты из заданной коллекции любого поддерживаемого библиотекой типа:
NSLog( @"%@", list);
NSLog( @"%@", list);
2016-08-17 21:12:22.054 libtest[3347:183566] List count=3: (
"00",
"01",
"02"
)
Current object: "00"
2016-08-17 21:12:22.055 libtest[3347:183566] List count=5: (
"00",
"01",
"XX",
"ZZ",
"02"
)
Current object: "00"
Удаление объектов из списка
Класс SCBidirectionalList декларирует следующие методы удаления объектов из списка:
- (void)removeLastObject;
Метод removeLastObject удаляет из двунаправленного списка последний объект:
NSLog( @"%@", list);
NSLog( @"%@", list);
2016-08-17 21:15:38.556 libtest[3382:184602] List count=3: (
"00",
"01",
"02"
)
Current object: "00"
2016-08-17 21:15:38.557 libtest[3382:184602] List count=2: (
"00",
"01"
)
Current object: "00"
Замена объектов списка
Для осуществления замены объектом класс SCBidirectionalList объявляет следующие методы:
Метод replaceLastObjectWithObject: заменяет последний объект двунаправленного списка заданным объектом:
NSLog( @"%@", list);
NSLog( @"%@", list);
2016-08-17 21:20:48.686 libtest[3422:186097] List count=3: (
"00",
"01",
"02"
)
Current object: "00"
2016-08-17 21:20:48.686 libtest[3422:186097] List count=3: (
"00",
"01",
"=="
)
Current object: "00"
Копирование объектов списка
Копирование объектов двунаправленного списка осуществляется следующими методами:
- (void)duplicateLastObject;
Метод duplicateLastObject копирует последний объект двунаправленного списка:
NSLog( @"%@", list);
NSLog( @"%@", list);
2016-08-17 21:22:27.623 libtest[3448:186559] List count=3: (
"00",
"01",
"02"
)
Current object: "00"
2016-08-17 21:22:27.623 libtest[3448:186559] List count=4: (
"00",
"01",
"02",
"02"
)
Current object: "00"
Сортировщики
Коллекции, которые поддерживают прямой доступ к объектам (массивы и упорядоченные множества), также поддерживают сортировку своих элементов. Однако сами коллекции данных типов алгоритмов сортировки не реализуют. Такой подход связан с тем, что в настоящее время известно множество таких алгоритмов, а в будущем возможна разработка новых, и нет смысла тратить время и ресурсы на реализацию в библиотеке их всех. Но в то же время необходима возможность по добавлению новых алгоритмов сортировки.
Именно поэтому реализация алгоритмов сортировки из классов коллекций вынесена в отдельные классы, именуемые сортировщиками. Именно экземпляры классов-сортировщиков и выполняют все работы по реальной сортировке данных.
Протокол и класс SCSorter
Совместимые с библиотекой сортировщики должны соответствовать протоколу SCSorter. Данный протокол объявляет обязательными реализацию сортировщиком следующих методов:
- (void)descendingSortText:(
SCStrings *)text;
- Метод ascendingSortCollection: вызывается для сортировки содержимого коллекции в порядке возрастания - от меньшего значения к большему.
Два последних метода протокола работают не с коллекциями, а со списками строк, текстами и текстовыми файлами, которые описаны в отдельном разделе данного руководства. Введение данных методов связано с определенными особенностями работы с текстовыми данными.
Класс SCSorter является полной реализацией протокола SCSorter и введет для удобства последующей реализации новых классов сортировки данных. В настоящее время в состав библитеки входят два дочерних класса, предоставляющих готовые алгоритмы сортировки:
Данные классы описаны в следующих параграфах нашей документации.
Сортировщик SCBubbleSorter
Класс SCBubbleSorter реализует один из самых простых и известных алгоритмов сортировки, известный под названием "пузырька" или "пузырьковой сортировки". Главный недостаток алгоритма - его низкая скорость. В классе объявлен только один классовый метод, отвечающий за создание сортировщика:
Сортировщик SCFastSorter
Класс SCFastSorter обеспечивает реализацию известного алгоритма быстрой сортировки. Данный алгоритм является сортировщиком по умолчанию для коллекций библиотеки. В классе декларирован только один метод создания сортировщика:
Коллекции и стандартные классы
Библиотека реализует определенную (но не полную совместимость) коллекций и стандартных классов Objective C. Частичная совместимость может быть условно разделена на следующие группы:
- Использование экземпляров классов в качестве аргументов. Многие методы классов библиотеки воспринимают экземпляры классов в качестве аргументов методов. Например, мы может создать очередь с использованием объектов из существующего стандартного массива или стандартного множества:
NSArray *source = [NSArray arrayWithObjects:@"000", @"002", @"003", nil];
NSLog( @"%@", array);
2016-08-17 23:50:45.767 libtest[4470:259649] Array count=3: (
"000",
"002",
"003"
)
- Преобразование в экземпляры стандартных классов. Большое количество библиотек (как стандартных, так и третьих разработчиков), не могут воспринимать наши классы в качестве аргументов, но могут работать с классами стандартных коллекций Objective C. Поэтому наши классы поддерживают методы преобразования коллекций в экземпляры стандартных классов. Подробно данные методы описаны в разделе Преобразование коллекций. Здесь мы приведем простой пример такого преобразования:
NSArray *array = [NSArray arrayWithArray:[source foundationArray]];
NSLog( @"%@", array);
2016-08-17 23:59:26.107 libtest[4538:263509] (
000,
002,
003
)
- Дополнение функциональности стандартных классов. Ряд методов из классов библиотеки через категории реализуется и в стандартных классах. Сделано это для того, чтобы у программистов был выбор между использованием классов библиотеки и стандартных классов. Подробно данные расширения описаны в разделе Расширения стандартных классов.
Все библиотечные классы имеют ряд общих отличий от стандартных классов:
- библиотечные классы коллекции поддерживают именованные коллекции, то есть коллекции, имеющие имена, тогда как стандартные классы являются неименованными:
NSLog(
@"%@", array.
name);
array.
name =
@"Special Array";
NSLog(
@"%@", array.
name);
2016-08-18 00:30:18.210 libtest[4688:276318] Sample Array
2016-08-18 00:30:18.210 libtest[4688:276318] Special Array
- в отличие от стандартных классов библиотечные поддерживают флаг режима "только для чтения", благодаря которому можно программно включать и отключать защиту от несанкционированного изменения содержимого коллекции. При попытке внести изменения в защищенную коллекцию генерируется исключительная ситуация SCL-20043.
- библиотечные классы коллекции позволяют указать экземпляр класса делегирования, требования и возможности которого описаны в соответствующем разделе документации.
Обработка ошибок при работе с коллекциями
При работе c коллекциями могут возникать различные ошибки. В данном разделе мы опишем процедуру их обработки механизмом коллекций.
Если коллекция обнаруживает возникновение той или иной ошибки, она прежде всего проверяет, назначен ли объект делегирования (описан в следующем разделе документации). Если таковой объект не назначен, выполняется генерация исключительной ситуации SCCollectionException.
Если объект делегирования назначен, то коллекция вызывает его метод collection:didDetectException:. В том случае, если данный метод возвращает значение YES, то коллекция игнорирует возникшую ошибку. В противном случае коллекция генерирует исключительную ситуацию SCCollectionException.
Подробности о конкретных ошибках коллекций приведены в разделе Ошибки коллекций. В данном разделе мы приведем описание основных ошибок коллекций:
- Ошибка SCL-20042 вызывается в том случае, когда в качестве аргумента того или иного метода вместо ожидаемой коллекции любого типа передается указатель на другой класс. Данная проверка выполняется из-за того, что первоначально мы не использовали протоколов коллекций и вынуждены были использовать тип id, при работе с которым проверка на этапе компиляции невозможна. В будущем мы предполагаем решить данный вопрос, однако это не является для нас приоритетной задачей.
- Ошибка SCL-20043 генерируется при попытке внести изменения в коллекцию, которая находится в режиме "только для чтения". Применение данного механизма позволяет не разделять функциональность между несколькими классами, как это сделано в стандартных классах (как пример - классы NSArray и NSMutableArray).
- Ошибка SCL-20046 возникает, если коллекция встречает объект класса, который не реализует протокол SCCollectioning. Хотим обратить внимание на то, что простое добавление таких объектов не приводит к немедленной генерации данной ошибки. Она генерируется только тогда, когда механизм коллекций пытается вызвать методы, протокола, например при попытке копировать элемент коллекции или в ходе сортировки данных.
Протокол делегирования SCCollectionDelegate
Для реагирования на различные события в классах коллекций программист может назначить объект делегирования через присвоение значения свойству delegate.
Объектом делегирования может быть экземпляр любого класса, который соответствует протоколу SCCollectionDelegate или унаследован от класса SCCollectionDelegate (входящий в состав библиотеки класс, реализующий данный протокол).
Ниже мы рассмотрим различные методы протокола и опишем события, при наступлении которых они вызываются.
Обработка ошибок коллекций
Протокол SCCollectionDelegate определяет следующие методы обработки ошибок:
- Метод collection:didDetectException: вызывается при обнаружении той или иной ошибки при работе с коллекцией. Если метод возвращает значение YES, то коллекция игнорирует возникшую ошибку, в противном случае генерируется исключительная ситуация, соответствующая ошибке. Таким образом библиотека предоставляет программистам возможность управлять процессом обработки ошибок.
События добавления элементов
Протокол SCCollectionDelegate определяет ряд методов, вызываемых в ходе выполнения операций добавления объектов в коллекцию:
- (void)collection:(
SCCollection *)collection willAddObject:(
id)object;
- (void)collection:(
SCCollection *)collection willInsertObject:(
id)object atIndex:(
SCIndex)index;
- (void)collection:(
SCCollection *)collection willSetObject:(
id)object forKey:(NSString *)key;
- (void)collection:(
SCCollection *)collection willSetValue:(
id)value forKey:(NSString *)key;
- (void)collection:(
SCCollection *)collection didFinishAddingObject:(
id)object;
- (void)collection:(
SCCollection *)collection didFinishInsertingObject:(
id)object atIndex:(
SCIndex)index;
- (void)collection:(
SCCollection *)collection didFinishSettingObject:(
id)object forKey:(NSString *)key;
- (void)collection:(
SCCollection *)collection didFinishSettingValue:(
id)value forKey:(NSString *)key;
События удаления элементов
Удаление объектов из коллекций сопровождается вызовами следующих методов протокола SCCollectionDelegate:
- (void)willRemoveAllObjectsFromCollection:(
SCCollection *)collection;
- (void)collection:(
SCCollection *)collection willRemoveObjectsOfClassName:(NSString *)name;
- (void)collection:(
SCCollection *)collection willRemoveObject:(
id)object;
- (void)collection:(
SCCollection *)collection willRemoveObjectForKey:(NSString *)key;
- (void)didFinishRemovingAllObjectsFromCollection:(
SCCollection *)collection;
- (void)collection:(
SCCollection *)collection didFinishRemovingObjectsOfClassName:(NSString *)name;
- (void)collection:(
SCCollection *)collection didFinishRemovingObject:(
id)object;
- (void)collection:(
SCCollection *)collection didFinishRemovingObjectForKey:(NSString *)key;
Обработка элементов коллекций
Протокол SCCollectionDelegate определяет методы обработки элементов коллекции:
- (void)processObject:(
id)object collection:(
SCCollection *)collection;
Сортировка данных
При выполнении сортировки объектов коллекции вызываются следующие методы протокола SCCollectionDelegate:
- (void)collection:(
SCCollection *)collection willSortAscending:(BOOL)ascending sorter:(
id<
SCSorter>)sorter;
- (void)collection:(
SCCollection *)collection didFinishSortingAscending:(BOOL)ascending sorter:(
id<
SCSorter>)sorter;
Замена элементов коллекции
Для обработки событий, связанных с заменой объектов в коллекциях, протокол SCCollectionDelegate декларирует следующие методы:
- (void)collection:(
SCCollection *)collection willReplaceObjectAtIndex:(
SCIndex)index withObject:(
id)object;
- (void)collection:(
SCCollection *)collection willReplaceObjectsInRange:(NSRange)range withCollection:(
id)source;
- (void)collection:(
SCCollection *)collection willReplaceObject:(
id)replaced withObject:(
id)object;
- (void)collection:(
SCCollection *)collection didFinishReplacingObjectAtIndex:(
SCIndex)index withObject:(
id)object;
- (void)collection:(
SCCollection *)collection didFinishReplacingObjectsInRange:(NSRange)range withCollection:(
id)source;
- (void)collection:(
SCCollection *)collection didFinishReplacingObject:(
id)replaced withObject:(
id)object;
Копирование и перемещение элементов коллекции
События копирования и перемещения объектов в коллекциях приводят к вызовам следующих методов протокола SCCollectionDelegate:
withObjectAtIndex:(
SCIndex)destination;
withObjectAtIndex:(
SCIndex)destination;
Списки строк, тексты и текстовые файлы
В состав библиотеки входит ряд классов, обеспечивающих обработку текстовой информации различного вида. На приведенной ниже схеме данные классы изображены в виде иерархии.
- Класс SCStrings реализует представление простого списка текстовых строк, обеспечивая различную функциональность по их обработке. Является базовым для всей иерархии текстовых классов.
- Класс SCUniqueStrings расширяет функциональность класса SCStrings путем реализации особой формы списка строк - списка уникальных строк, то есть списка, который не допускает повторного добавления одних и тех же строк.
- Класс SCText добавляет в иерархию классов методы обработки текстовых блоков. Именно данная функциональность делает из простого списка строк текст - более организованную строковую информацию.
- Класс SCTextFile обеспечивает взаимодействие с текстовыми файлами через операции чтения и записи текстов.
Следующие главы раздела рассматривают каждый из этих классов более подробно.
Списки строк
Как следует из названия, список строк представляет собой совокупность текстовых строк, объединяемых в одном экземпляре класса SCStrings. Кроме непосредственно хранения, список обеспечивает базовые методы для работы с содержащимися в неи строками - добавления, удаления, изменения, перемещения в пределах списка и так далее.
Класс SCStrings является базовым для иерархии текстовых классов, различным образом расширяющих функциональность своего базового класса. Данная глава посвящена классу SCStrings, а его потомки описываются в следующих главах руководства.
Создание списков строк
Как и все классы библиотеки, SCStrings объявляет классовые методы для создания экземпляров класса на основании данных из последовательных файлов, словарей и потоков:
+ (instancetype)stringsWithCoder:(NSCoder *)coder;
+ (instancetype)stringsWithContentsOfSerializedFile:(NSString *)path;
+ (instancetype)stringsWithDataDictionary:(NSDictionary *)dictionary;
+ (instancetype)stringsWithDataDictionaryFromFile:(NSString *)path;
+ (instancetype)stringsWithStream:(
SCStream *)stream;
+ (instancetype)stringsWithFileStream:(NSString *)path;
Создать экземпляр класса можно с использованием ряда классовых методов:
+ (instancetype)stringsWithName:(NSString *)name;
+ (instancetype)stringsWithString:(NSString *)string;
+ (instancetype)stringsWithCollection:(
id<
SCCollection>)collection;
+ (instancetype)stringsWithStrings:(
SCStrings *)strings;
+ (instancetype)strings;
- Классовый метод stringsWithName: создает пустой список строк с заданным именем:
2016-08-21 01:05:14.873 libtest[1859:144664] Strings list "Strings List" count=0, case sensitive: (
)
- Классовый метод stringsWithString: возвращает неименованный список строк, содержащий указанную в качестве аргумента строку. Если методу передан нулевой указатель, генерируется исключительная ситуация SCL-20064.
2016-08-21 01:07:29.829 libtest[1874:145195] Strings list count=1, case sensitive: (
Sample string
)
- Классовый метод stringsWithCollection: возвращает созданный неименованный список строк на основе строк, которые содержатся в указанной коллекции любого поддерживаемого библиотекой типа. Если в ходе обработки исходной коллекции будет обнаружен экземпляр класса, отличный от NSString, генерируется исключительная ситуация SCL-20066. Также при работе метода может возникнуть ошибка коллекции SCCollectionException.
2016-08-21 01:09:01.129 libtest[1896:145616] Strings list count=3, case sensitive: (
String 00
String 01
String 02
)
- Классовый метод stringsWithStrings: создает копию существующего списка строк:
2016-08-21 01:10:51.787 libtest[1923:146645] Strings list count=1, case sensitive: (
Source string
)
- Классовый метод strings возвращает пустой неименованный список строк:
2016-08-21 01:11:36.688 libtest[1938:146933] Strings list count=0, case sensitive: (
)
Инициализация списков строк
Класс SCStrings объявляет следующие инициализаторы экземпляров класса:
- (instancetype)initWithName:(NSString *)name;
- (instancetype)initWithString:(NSString *)string;
- (instancetype)initWithCollection:(
id<
SCCollection>)collection;
- (instancetype)initWithStrings:(
SCStrings *)strings;
- (instancetype)init;
- Метод initWithName: инициализирует пустой список строк с заданным именем.
- Метод initWithString: выполняет инициализацию неименованного списка строк, который содержит строку, указанную в качестве аргумента. При обнаружении пустого указателя метод генерирует исключительную ситуацию SCL-20064.
- Метод initWithCollection: возвращает инициализированный неименованный список строк, содержащий строки из указанной коллекции любого поддерживаемого библиотекой типа. Если в ходе обработки содержимого исходной коллекции будет обнаружен экземпляр отличного от NSString класса, будет сгенерирована исключительная ситуация SCL-20066. Также в ходе работы метода может быть сгенерирована ошибка коллекции SCCollectionException.
- Метод initWithStrings: осуществляет инициализацию копии указанного списка строк.
- Метод init инициализирует пустой неименованный список строк.
Свойства экземпляра класса
Класс SCStrings декларирует следующие основные свойства экземпляров класса:
@property (nonatomic, retain, getter=name, setter=setName:) NSString *name;
@property (nonatomic, assign, readonly, getter=count)
SCIndex count;
@property (nonatomic, assign, getter=readOnly, setter=setReadOnly:) BOOL readOnly;
@property (nonatomic, assign, readonly, getter=empty) BOOL empty;
@property (nonatomic, assign, readonly, getter=modified) BOOL modified;
@property (nonatomic, assign, getter=caseInsensitive, setter=setCaseInsensitive:) BOOL caseInsensitive;
@property (nonatomic, retain, getter=delegate, setter=setDelegate:) id<SCTextDelegate> delegate;
- Свойство name предоставляет программисту доступ к названию списка строк. Значение данного свойства может быть изменено в любой момент.
NSLog( @"%@", strings);
strings.
name =
@"Sample List";
NSLog( @"%@", strings);
2016-08-21 19:29:26.656 libtest[2783:365955] Strings list count=0, case sensitive: (
)
2016-08-21 19:29:26.656 libtest[2783:365955] Strings list "Sample List" count=0, case sensitive: (
)
- Свойство count возвращает количество строк в списке. Свойство доступно только для чтения:
NSLog(
@"Strings count: %qu", strings.
count);
2016-08-21 19:30:32.486 libtest[2810:366491] Strings count: 3
- Свойство readOnly позволяет управлять защитой от несанкционированного изменения содержимого списка строк. При попытках внести изменения (удалить, добавить, изменить строки и так далее) в находящийся в режиме "только для чтения" список строк, возможна генерация исключительной ситуации SCL-20063.
2016-08-21 19:31:24.657 libtest[2824:366802] SCL-20063: Text is read only
2016-08-21 19:31:24.657 libtest[2824:366802] ================================================
- Свойство empty принимает значение YES в том случае, если в списке не содержится ни одной строки, в противном случае данное свойство принимает значение NO. Свойство доступно только для чтения.
NSLog(
@"%d", strings.
empty);
NSLog(
@"%d", strings.
empty);
2016-08-21 19:32:11.699 libtest[2843:367123] 1
2016-08-21 19:32:11.699 libtest[2843:367123] 0
- Свойство modified возвращает значение YES если в список строк были произведены какие-либо изменения. Благодаря данному свойству дается возможность определить наличие изменений после загрузки списка строк из какого-либо источника, например из потока. Свойство доступно только для чтения.
2016-08-21 19:32:38.729 libtest[2856:367277] 0
2016-08-21 19:32:38.730 libtest[2856:367277] 1
- Свойство caseInsensitive управляет режимом регистронезависимости при обработке строк. Если значение свойства установлено в значение NO (по умолчанию), то при работе со строками экземпляр класса различает регистр символов (буквы 'A' и 'a' в этом случае считаются разными символами). При значении свойства равным YES операции осуществляются без учета регистра символов (Слова 'тест' и 'Тест' считаются одинаковыми).
NSLog( @"%@", strings);
NSLog( @"%@", strings);
2016-08-21 19:33:21.610 libtest[2872:367616] Strings list count=0, case sensitive: (
)
2016-08-21 19:33:21.610 libtest[2872:367616] Strings list count=0, case insensitive: (
)
Кроме непосредственно свойств класс SCStrings предоставляет ряд методов для доступа к значениям свойств экземпляра класса:
- (NSString *)name;
- (BOOL)readOnly;
- (BOOL)empty;
- (BOOL)modified;
- (BOOL)caseInsensitive;
- (id)delegate;
Также класс декларирует методы установки значений свойств экземпляра класса SCStrings:
- (void)setName:(NSString *)name;
- (void)setReadOnly:(BOOL)readOnly;
- (void)setCaseInsensitive:(BOOL)caseInsensitive;
Копирование списков строк
Для осуществления операций копирования списков строк класс SCStrings декларирует следующие методы:
- (void)setString:(NSString *)string;
- Метод setStrings: стирает текущее содержимое списка строк и заменяет его содержимым указанного существующего списка строк. Также копируются свойства исходного экземпляра класса. При попытке вызвать этот метод для списка доступа, находящегося в режиме "только для чтения", генерируется исключительная ситуация SCL-20063. Если методу передан нулевой указатель, генерируется ошибка SCL-20061.
NSLog( @"%@", strings);
NSLog( @"%@", strings);
2016-08-21 21:08:27.273 libtest[3353:407433] Strings list count=2, case sensitive, modified: (
Line 00
Line 01
)
2016-08-21 21:08:27.273 libtest[3353:407433] Strings list "Sample Strings" count=3, case sensitive, modified: (
String 00
String 10
String 20
)
- Метод setCollection: удаляет текущее содержимое списка строк и заменяет его строками из указанной коллекции любого поддерживаемого библиотекой типа.
NSLog( @"%@", strings);
NSLog( @"%@", strings);
2016-08-21 21:10:08.923 libtest[3377:408072] Strings list count=2, case sensitive, modified: (
Line 00
Line 01
)
2016-08-21 21:10:08.923 libtest[3377:408072] Strings list count=2, case sensitive, modified: (
String 00
String 01
)
При вызове данного метода возможно возникновение следующих ошибок:
- SCL-20061 - передан нулевой указатель на исходную коллекцию
- SCL-20063 - список строк находится в режиме "только для чтения"
- SCL-20066 - в исходной коллекции обнаружены экземпляры отличного от NSString класса
- Метод setString: стирает текущее содержимое списка строк и вместо него добавляет указанную в качестве аргумента метода строку:
NSLog( @"%@", strings);
NSLog( @"%@", strings);
2016-08-21 21:11:14.668 libtest[3396:408402] Strings list count=2, case sensitive, modified: (
Line 00
Line 01
)
2016-08-21 21:11:14.668 libtest[3396:408402] Strings list count=1, case sensitive, modified: (
Sample String
)
Данный метод может вызвать следующие ошибки:
- SCL-20061 - передан нулевой указатель на исходную строку
- SCL-20063 - список строк находится в режиме "только для чтения"
Сравнение списков строк
Для сравнения списков строк класс SCStrings объявляет следующие методы:
- (BOOL)isEqualToStrings:(
SCStrings *)strings;
- Метод isEqualToStrings: сравнивает список строк с указанным в качестве аргумента метода списком строк.
- Метод isEqualToCollection: выполняет сравнение списка строк с указанной коллекцией любого поддерживаемого библиотекой типа. Если в коллекции находсятся объекты, отличные от NSString, генерируется исключительная ситуация SCL-20066.
Счетчики строк
Для доступа к счетчикам строк класс SCStrings предоставляет следующие свойства и методы:
@property (nonatomic, retain, readonly, getter=stringEnumerator) NSEnumerator *stringEnumerator;
@property (nonatomic, retain, readonly, getter=reverseStringEnumerator) NSEnumerator *reverseStringEnumerator;
- (NSEnumerator *)stringEnumerator;
- (NSEnumerator *)reverseStringEnumerator;
- (void)enumerate;
- (void)reverseEnumerate;
- Свойство stringEnumerator возвращает указатель на счетчик строк из списка:
NSString *string;
while ( ( string = enumerator.nextObject)) NSLog( @"%@", string);
2016-08-21 22:35:39.603 libtest[3755:446891] String 00
2016-08-21 22:35:39.603 libtest[3755:446891] String 10
2016-08-21 22:35:39.603 libtest[3755:446891] String 20
- Свойство reverseStringEnumerator возвращает обратный счетчик строк, то есть объект, в котором строки из списка перечисляются в обратном порядке:
NSString *string;
while ( ( string = enumerator.nextObject)) NSLog( @"%@", string);
2016-08-21 22:36:26.230 libtest[3771:447145] String 20
2016-08-21 22:36:26.230 libtest[3771:447145] String 10
2016-08-21 22:36:26.230 libtest[3771:447145] String 00
- Методы enumerate и enumerateWithDelegate: для каждой строки списка в прямом порядке вызывают метод processString:text: объекта делегирования SCTextDelegate. Отличие методов в том, что enumerateWithDelegate: работает с указанным в качестве аргумента объектом делегирования, тогда как метод enumerate использует заданный объект делегирования списка строк.
@end
@implementation SCTestDelegate
- (void)processString:(NSString *)string text:(
SCStrings *)text {
NSLog( @"=> %@ <=", string);
}
@end
strings.
delegate = [[[SCTestDelegate alloc] init] autorelease];
2016-08-21 22:39:13.846 libtest[3829:448245] => String 00 <=
2016-08-21 22:39:13.846 libtest[3829:448245] => String 01 <=
2016-08-21 22:39:13.846 libtest[3829:448245] => String 02 <=
- Методы reverseEnumerate и reverseEnumerateWithDelegate: действуют аналогично методам enumerate и enumerateWithDelegate:, только вызовы метода объекта делегирования осуществляются в обратном порядке следования строк:
strings.
delegate = [[[SCTestDelegate alloc] init] autorelease];
2016-08-21 22:40:29.470 libtest[3853:448743] => String 02 <=
2016-08-21 22:40:29.470 libtest[3853:448743] => String 01 <=
2016-08-21 22:40:29.470 libtest[3853:448743] => String 00 <=
Преобразование списков строк
Класс SCStrings декларирует ряд методов для преобразования списка строк в другие форматы данных:
@property (nonatomic, retain, readonly, getter=array)
SCArray *array;
@property (nonatomic, retain, readonly, getter=foundationArray) NSArray *foundationArray;
- (NSArray *)foundationArray;
- Свойство array возвращают содержащиеся в списке строки в виде массива класса SCArray:
NSLog(
@"%@", strings.
array);
2016-08-21 23:21:44.308 libtest[4105:471168] Array "Sample List" count=3: (
"String 00",
"String 01",
"String 02"
)
- Свойство foundationArray возвращает строки из списка в формате стандартного массива NSArray:
NSLog( @"%@", [strings foundationArray]);
2016-08-21 23:22:20.280 libtest[4120:471382] (
"String 00",
"String 01",
"String 02"
)
Сортировка строк
Класс SCStrings объявляет ряд методов сортировки строк:
@property (nonatomic, retain, readonly, getter=sortedStrings)
SCStrings *sortedStrings;
- (void)sortAscendingWithSorter:(
id<
SCSorter>)sorter;
- (void)sortDescendingWithSorter:(
id<
SCSorter>)sorter;
- (void)sortWithSorter:(
id<
SCSorter>)sorter;
- (void)sortAscending;
- (void)sortDescending;
- (void)sort;
- Метод sortAscendingWithSorter: выполняет сортировку содержимого списка строк по лексикографическому возрастанию с использованием указанного сортировщика данных.
- Метод sortDescendingWithSorter: сортирует строки в списке строк по лексикографическому убыванию с применением заданного сортировщика данных.
- Метод sortAscending осуществляет сортировку строк по лексикографическому возрастанию с использованием сортировщика данных по умолчанию:
NSLog( @"%@", strings);
NSLog( @"%@", strings);
2016-08-22 00:24:00.530 libtest[4485:507068] Strings list count=3, case sensitive, modified: (
String 04
String 02
String 06
)
2016-08-22 00:24:00.530 libtest[4485:507068] Strings list count=3, case sensitive, modified: (
String 02
String 04
String 06
)
- Метод sortDescending сортирует содержимое список строк по лексикографическому убыванию с применением сортировщика данных по умолчанию:
NSLog( @"%@", strings);
NSLog( @"%@", strings);
2016-08-22 00:26:16.441 libtest[4510:507965] Strings list count=3, case sensitive, modified: (
String 04
String 02
String 06
)
2016-08-22 00:26:16.441 libtest[4510:507965] Strings list count=3, case sensitive, modified: (
String 06
String 04
String 02
)
- Внимание
- При попытке вызвать любой из вышеперечисленных методов для списка строк в режиме "только для чтения" генерируется ошибка SCL-20063.
- Метод ascendingSortedStringsWithSorter: возвращает список отсортированных по лексикографическому возрастанию исходного списка строк с применением заданного сортировщика данных.
- Метод ascendingSortedStrings возвращает список строк, отсортированный по лексикографическому возрастанию с применением сортировщика данных по умолчанию. Аналогом данного метода является свойство sortedStrings.
- Метод descendingSortedStrings возвращает отсортированный список строк по лексикографическому убыванию с использованием сортировщика данных по умолчанию.
- Свойство sortedStrings возвращает список строк, отсортированных по лексикографическому возрастанию с задействованием сортировщика данных по умолчанию. Является аналогами метода ascendingSortedStrings.
2016-08-22 18:36:38.411 libtest[4953:619805] Strings list count=3, case sensitive, modified: (
String 02
String 04
String 06
)
- Внимание
- Сортировка строк зависит от режима регистронезависимости списка строк.
В ходе работы данных методов вызываются обработчики событий text:willSortAscending:sorter: и text:didFinishSortingAscending:sorter: протокола SCTextDelegate.
Добавление строк
Если описанные в данном параграфе методы вызываются для списка строк, находящегося в режиме "только для чтения", происходит генерация исключительной ситуации SCL-20063.
Добавление строк в конец списка осуществляется следующими методами класса SCStrings:
- (void)addString:(NSString *)string;
- (void)addLine;
- Метод addString: добавляет указанную строку в конец списка. Если в качестве аргумента метода был передан нулевой указатель, генерируется исключительная ситуация SCL-20064.
2016-08-22 18:54:19.351 libtest[5093:629449] Strings list count=3, case sensitive, modified: (
String 00
String 01
String 02
)
- Метод addCollection: добавляет в конец списка строк данные из указанной коллекции любого поддерживаемого библиотекой типа:
NSLog( @"%@", strings);
NSLog( @"%@", strings);
2016-08-22 18:56:10.014 libtest[5119:630064] Strings list count=2, case sensitive, modified: (
String 00
String 01
)
2016-08-22 18:56:10.014 libtest[5119:630064] Strings list count=4, case sensitive, modified: (
String 00
String 01
String 10
String 11
)
При работе данного метода могут возникнуть следующие исключительные ситуации:
- SCL-20061 - в качестве аргумента передан нулевой указатель
- SCL-20063 - список строк находится в режиме "только для чтения"
- SCL-20066 - коллекция содержит отличные от строк объекты
- Метод addStrings: выполняет объединение двух списков строк путем добавления строк из указанного в качестве аргумента метода списка строк к списку строк, для которого был вызван метод. Если методу передан нулевой указатель, генерируется исключительная ситуация SCL-20061.
NSLog( @"%@", strings);
NSLog( @"%@", strings);
2016-08-22 18:58:01.724 libtest[5142:630607] Strings list count=2, case sensitive, modified: (
String 00
String 01
)
2016-08-22 18:58:01.724 libtest[5142:630607] Strings list count=4, case sensitive, modified: (
String 00
String 01
String 02
String 03
)
- Метод addLine добавляет в конец списка пустую строку. Пустой является строка, которая не содержит символов. При этом пустая строка - это существующий объект и не имеет отношения к нулевому указателю на строку.
NSLog( @"%@", strings);
NSLog( @"%@", strings);
2016-08-22 18:59:46.092 libtest[5160:631400] Strings list count=2, case sensitive, modified: (
String 00
String 01
)
2016-08-22 18:59:46.093 libtest[5160:631400] Strings list count=3, case sensitive, modified: (
String 00
String 01
)
При работе данных методов осуществляется вызов событий text:willAddString: и text:didFinishAddingString: объекта делегирования, соответствующего протоколу SCTextDelegate.
Кроме операций добавления строк в конец списка класс SCStrings декларирует ряд методов для вставки новых строк по указанным позициям:
- (void)insertString:(NSString *)string atIndex:(
SCIndex)index;
- (void)insertStrings:(
SCStrings *)strings atIndexes:(NSIndexSet *)indexes;
- (void)insertCollection:(
id<
SCCollection>)collection atIndexes:(NSIndexSet *)indexes;
- (void)insertLineAtIndex:(
SCIndex)index;
- Метод insertString:atIndex: вставляет указанную строку перед заданным индексом:
NSLog( @"%@", strings);
NSLog( @"%@", strings);
2016-08-22 19:04:09.935 libtest[5186:633910] Strings list count=3, case sensitive, modified: (
String 00
String 01
String 02
)
2016-08-22 19:04:09.935 libtest[5186:633910] Strings list count=4, case sensitive, modified: (
String 00
String 01
==========
String 02
)
При работе метода могут возникнуть следующие ошибки:
- SCL-20063 - список строк находится в режиме "только для чтения"
- SCL-20064 - вместо строки передан нулевой указатель
- SCL-20072 - передан некорректный индекс для вставки строки
- Метод insertStrings:atIndex: вставляет строки из указанного списка в позицию по заданному индексу:
NSLog( @"%@", strings);
NSLog( @"%@", strings);
2016-08-22 19:06:57.335 libtest[5214:634866] Strings list count=3, case sensitive, modified: (
String 00
String 01
String 02
)
2016-08-22 19:06:57.335 libtest[5214:634866] Strings list count=5, case sensitive, modified: (
String 00
String 01
Line 00
Line 01
String 02
)
В ходе работы метода могут быть сгенерированы следующие исключительные ситуации:
- SCL-20061 - вместо списка строк передан нулевой указатель
- SCL-20063 - список строк находится в режиме "только для чтения"
- SCL-20072 - передан некорректный индекс для вставки строк
- Метод insertCollection:atIndex: вставляет строки из заданной коллекции любого поддерживаемого библиотекой типа по указанному индексу:
NSLog( @"%@", strings);
NSLog( @"%@", strings);
2016-08-22 19:20:02.227 libtest[5243:639086] Strings list count=3, case sensitive, modified: (
String 00
String 01
String 02
)
2016-08-22 19:20:02.227 libtest[5243:639086] Strings list count=5, case sensitive, modified: (
String 00
String 01
000
010
String 02
)
При работе метода могут возникнуть следующие исключительные ситуации:
- SCL-20061 - вместо коллекции передан нулевой указатель
- SCL-20063 - список строк находится в режиме "только для чтения"
- SCL-20066 - в коллекции содержатся отличные от строк объекты
- SCL-20072 - передан некорректный индекс для вставки строк
- Метод insertStrings:atIndexes: вставляет строки из указанного списка по индексам из заданного множества индексов. Количество строк в списке должно совпадать с количеством индексов во множестве.
NSLog( @"%@", strings);
NSMutableIndexSet *indexSet = [NSMutableIndexSet indexSet];
[indexSet addIndex:0];
[indexSet addIndex:2];
NSLog( @"%@", strings);
2016-08-22 19:24:46.145 libtest[5303:640632] Strings list count=3, case sensitive, modified: (
String 00
String 01
String 02
)
2016-08-22 19:24:46.145 libtest[5303:640632] Strings list count=5, case sensitive, modified: (
=========
String 00
=========
String 01
String 02
)
Метод может генерировать следующие исключительные ситуации:
- SCL-20061 - нулевой указатель вместо списка строк
- SCL-20063 - список строк находится в режиме "только для чтения"
- SCL-20074 - передано некорректное множество индексов
- SCL-20075 - количество строк не совпадает с количеством индексов
- Метод insertCollection:atIndexes: вставляет строки из заданной коллекции любого поддерживаемого библиотекой типа по индексам из указанного множества индексов. Количество строк в коллекции должно совпадать с количеством индексов во множестве.
NSLog( @"%@", strings);
NSMutableIndexSet *indexSet = [NSMutableIndexSet indexSet];
[indexSet addIndex:0];
[indexSet addIndex:2];
NSLog( @"%@", strings);
2016-08-22 19:26:22.878 libtest[5327:641164] Strings list count=3, case sensitive, modified: (
String 00
String 01
String 02
)
2016-08-22 19:26:22.878 libtest[5327:641164] Strings list count=5, case sensitive, modified: (
000
String 00
010
String 01
String 02
)
Выполнение метода может вызвать следующие ошибки:
- SCL-20061 - нулевой указатель вместо коллекции
- SCL-20063 - список строк находится в режиме "только для чтения"
- SCL-20066 - коллекция содержит отличные от строк объекты
- SCL-20074 - передано некорректное множество индексов
- SCL-20075 - количество строк не совпадает с количеством индексов
- Метод insertLineAtIndex: вставляет пустую строку по заданному индексу:
NSLog( @"%@", strings);
NSLog( @"%@", strings);
2016-08-22 19:28:24.407 libtest[5351:641841] Strings list count=3, case sensitive, modified: (
String 00
String 01
String 02
)
2016-08-22 19:28:24.407 libtest[5351:641841] Strings list count=4, case sensitive, modified: (
String 00
String 01
String 02
)
Работа методов вставки строк сопровождается вызовами обработчиков событий text:willInsertString:atIndex: и text:didFinishInsertingString:atIndex: объекта делегирования списка строк.
Удаление строк
Класс SCStrings декларирует большое количество методов удаления строк по различным критериям:
- (void)removeAllStrings;
- (void)removeFirstString;
- (void)removeLastString;
- (void)removeStringAtIndex:(
SCIndex)index;
- (void)removeStringsAtIndexes:(NSIndexSet *)indexes;
- (void)removeString:(NSString *)string;
- (void)removeStringsWithSubstring:(NSString *)substring;
- (void)removeStringsNotAtIndexes:(NSIndexSet *)indexes;
- (void)removeStringsNotEqualTo:(NSString *)string;
- (void)removeStringsNotInStrings:(
SCStrings *)strings;
- (void)removeStringsNotInCollection:(
id<
SCCollection>)collection;
- (void)removeStringsWithoutSubstring:(NSString *)substring;
- (void)removeDuplicatedStrings;
Если любой из этих методов вызывается для списка строк, находящегося в режиме "только для чтения", генерируется исключительная ситуация SCL-20063.
- Метод removeFirstString удаляет первую строку в списке:
NSLog( @"%@", strings);
NSLog( @"%@", strings);
2016-08-22 21:42:19.234 libtest[5965:708191] Strings list count=3, case sensitive, modified: (
String 00
String 01
String 02
)
2016-08-22 21:42:19.235 libtest[5965:708191] Strings list count=2, case sensitive, modified: (
String 01
String 02
)
- Метод removeLastString удаляет из списка последнюю строку:
NSLog( @"%@", strings);
NSLog( @"%@", strings);
2016-08-22 21:44:02.899 libtest[5987:709225] Strings list count=3, case sensitive, modified: (
String 00
String 01
String 02
)
2016-08-22 21:44:02.899 libtest[5987:709225] Strings list count=2, case sensitive, modified: (
String 00
String 01
)
- Метод removeStringAtIndex: удаляет из списка строку с указанным индексом. При попытке удалить строку с несуществующим индексом генерируется ошибка SCL-20072.
NSLog( @"%@", strings);
NSLog( @"%@", strings);
2016-08-22 21:47:44.866 libtest[6019:711494] Strings list count=3, case sensitive, modified: (
String 00
String 01
String 02
)
2016-08-22 21:47:44.866 libtest[6019:711494] Strings list count=2, case sensitive, modified: (
String 00
String 02
)
- Метод removeStringsAtIndexes: удаляет из списка строки по индексам из указанного множества индексов. Если методу передано некорректное множество индексов, генерируется исключительная ситуация SCL-20074.
NSLog( @"%@", strings);
NSMutableIndexSet *indexSet = [NSMutableIndexSet indexSet];
[indexSet addIndex:1];
[indexSet addIndex:3];
NSLog( @"%@", strings);
2016-08-22 21:51:04.216 libtest[6048:713775] Strings list count=4, case sensitive, modified: (
String 00
String 01
String 02
String 03
)
2016-08-22 21:51:04.217 libtest[6048:713775] Strings list count=2, case sensitive, modified: (
String 00
String 02
)
В ходе выполнения данных методов класс SCStrings вызывает обработчики событий text:willRemoveStringAtIndex: и text:didFinishRemovingStringAtIndex: объекта делегирования экземпляра класса.
- Метод removeString: удаляет из списка строк все вхождения указанной строки:
NSLog( @"%@", strings);
NSLog( @"%@", strings);
2016-08-22 21:53:58.476 libtest[6074:716014] Strings list count=3, case sensitive, modified: (
String 00
String 01
String 02
)
2016-08-22 21:53:58.476 libtest[6074:716014] Strings list count=2, case sensitive, modified: (
String 00
String 02
)
- Метод removeStrings: удаляет из списка строки, присутствующие в указанном в качестве аргумента метода списке строк:
NSLog( @"%@", strings);
NSLog( @"%@", strings);
NSLog( @"%@", strings);
NSLog( @"%@", strings);
- Метод removeCollection: удаляет из списка строки, которые присутствуют в заданной коллекции любого поддерживаемого библиотекой типа. Если в коллекции присутствуют отличные от строк объекты, метод генерирует ошибку SCL-20066.
NSLog( @"%@", strings);
NSLog( @"%@", strings);
2016-08-22 22:04:54.229 libtest[6152:720528] Strings list count=4, case sensitive, modified: (
String 00
String 01
String 02
String 03
)
2016-08-22 22:04:54.230 libtest[6152:720528] Strings list count=2, case sensitive, modified: (
String 00
String 02
)
- Метод removeStringsWithSubstring: удаляет из списка строки, которые содержат заданную подстроку:
NSLog( @"%@", strings);
NSLog( @"%@", strings);
2016-08-22 22:09:28.118 libtest[6177:723112] Strings list count=4, case sensitive, modified: (
String 00
Line 01
String 02
Line 03
)
2016-08-22 22:09:28.118 libtest[6177:723112] Strings list count=2, case sensitive, modified: (
Line 01
Line 03
)
Вышеперечисленные методы вызывают обработчики событий text:willRemoveString: и text:didFinishRemovingString: объекта делегирования списка строк.
- Метод removeStringsNotAtIndexes: удаляет строки, находящиеся по индексам из заданного множества индексов:
NSLog( @"%@", strings);
NSMutableIndexSet *indexSet = [NSMutableIndexSet indexSet];
[indexSet addIndex:0];
[indexSet addIndex:1];
NSLog( @"%@", strings);
2016-08-22 22:14:21.487 libtest[6219:726403] Strings list count=3, case sensitive, modified: (
String 00
String 01
String 02
)
2016-08-22 22:14:21.488 libtest[6219:726403] Strings list count=2, case sensitive, modified: (
String 00
String 01
)
Метод вызывает обработчики событий text:willRemoveStringAtIndex: и text:didFinishRemovingStringAtIndex: объекта делегирования экземпляра класса.
- Метод removeStringsNotEqualTo: удаляет из списка строк все строки, которые не соответствуют заданной в качестве аргумента метода строке:
NSLog( @"%@", strings);
NSLog( @"%@", strings);
2016-08-22 22:32:17.875 libtest[6332:735443] Strings list count=3, case sensitive, modified: (
String 00
String 01
String 02
)
2016-08-22 22:32:17.875 libtest[6332:735443] Strings list count=1, case sensitive, modified: (
String 00
)
- Метод removeStringsNotInStrings: удаляет из списка строки, отсутствующие в заданном в качестве аргумента метода списке строк:
NSLog( @"%@", strings);
NSLog( @"%@", strings);
2016-08-22 22:36:32.866 libtest[6368:739263] Strings list count=4, case sensitive, modified: (
String 00
String 01
String 02
String 03
)
2016-08-22 22:36:32.866 libtest[6368:739263] Strings list count=2, case sensitive, modified: (
String 00
String 02
)
- Метод removeStringsNotInCollection: удаляет из списка строки, которые не входят в заданную коллекцию любого поддерживаемого типа. Если в указанной коллекции будут обнаружены объекты, не являющиеся строками, метод генерирует ошибку SCL-20066.
NSLog( @"%@", strings);
NSLog( @"%@", strings);
2016-08-22 22:58:11.895 libtest[6442:754405] Strings list count=4, case sensitive, modified: (
String 00
String 01
String 02
String 03
)
2016-08-22 22:58:11.895 libtest[6442:754405] Strings list count=2, case sensitive, modified: (
String 01
String 03
)
- Метод removeStringsWithoutSubstring: удаляет из списка строки, не содержащие указанной подстроки:
NSLog( @"%@", strings);
NSLog( @"%@", strings);
2016-08-22 23:05:31.458 libtest[6496:761256] Strings list count=4, case sensitive, modified: (
String 00
Line 01
String 02
Line 03
)
2016-08-22 23:05:31.459 libtest[6496:761256] Strings list count=2, case sensitive, modified: (
String 00
String 02
)
- Метод removeDuplicatedStrings удаляет из списка все повторяющиеся строки:
NSLog( @"%@", strings);
NSLog( @"%@", strings);
2016-08-22 23:14:02.184 libtest[6525:768751] Strings list count=4, case sensitive, modified: (
String 00
String 01
String 01
String 00
)
2016-08-22 23:14:02.184 libtest[6525:768751] Strings list count=2, case sensitive, modified: (
String 00
String 01
)
Описанные выше методы вызывают обработчики событий text:willRemoveStringAtIndex: и text:didFinishRemovingStringAtIndex: объекта делегирования, соответствующего протоколу SCTextDelegate.
Замена строк
Класс SCStrings определяет ряд методов для осуществления замены строк:
- (void)replaceStringAtIndex:(
SCIndex)index withString:(NSString *)string;
- (void)replaceStringsAtIndexes:(NSIndexSet *)indexes withStrings:(
SCStrings *)strings;
- (void)replaceStringsAtIndexes:(NSIndexSet *)indexes withCollection:(
id<
SCCollection>)collection;
- (void)replaceString:(NSString *)string withString:(NSString *)newString;
Вызов любого из этих методов для списка строк, находящегося в режиме "только для чтения", приводит к генерации исключительной ситуации SCL-20063.
- Метод replaceStringAtIndex:withString: заменяет строку по указанному индексу на заданную строку:
NSLog( @"%@", strings);
NSLog( @"%@", strings);
2016-08-23 23:26:24.102 libtest[1628:99073] Strings list count=3, case sensitive, modified: (
String 00
String 01
String 02
)
2016-08-23 23:26:24.102 libtest[1628:99073] Strings list count=3, case sensitive, modified: (
String 00
=========
String 02
)
При работе данного метода могут возникнуть следующие ошибки:
- SCL-20063 - список строк находится в режиме "только для чтения"
- SCL-20064 - вместо замещающей строки передан нулевой указатель
- SCL-20072 - передан некорректный индекс строки
- Метод replaceStringsAtIndexes:withStrings: осуществляет замену строк по индексам из указанного множества индексов строками из заданного списка. Количество индексов должно совпадать с количеством строк.
NSLog( @"%@", strings);
NSMutableIndexSet *indexSet = [NSMutableIndexSet indexSet];
[indexSet addIndex:0];
[indexSet addIndex:3];
NSLog( @"%@", strings);
2016-08-24 01:04:48.486 libtest[2171:180542] Strings list count=4, case sensitive, modified: (
String 00
String 01
String 02
String 03
)
2016-08-24 01:04:48.486 libtest[2171:180542] Strings list count=4, case sensitive, modified: (
=========
String 01
String 02
---------
)
Метод может генерировать следующие исключительные ситуации:
- SCL-20061 - список замещающих строк не существует
- SCL-20063 - список строк находится в режиме "только для чтения"
- SCL-20074 - передано некорректное множество индексов
- SCL-20075 - количество индексов не совпадает с количеством строк
- Метод replaceStringsAtIndexes:withCollection: выполняет замену строк по индексам из заданного множества индексов строками из указанной коллекции любого поддерживаемого библиотекой типа. Количество индексов должно совпадать с количеством строк.
NSLog( @"%@", strings);
NSMutableIndexSet *indexSet = [NSMutableIndexSet indexSet];
[indexSet addIndex:1];
[indexSet addIndex:2];
NSLog( @"%@", strings);
NSLog( @"%@", strings);
NSMutableIndexSet *indexSet = [NSMutableIndexSet indexSet];
[indexSet addIndex:1];
[indexSet addIndex:2];
NSLog( @"%@", strings);
При работе метода могут возникнуть следующие ошибки:
- SCL-20061 - исходная коллекция не существует
- SCL-20063 - список строк находится в режиме "только для чтения"
- SCL-20066 - коллекция содержит отличные от строк объекты
- SCL-20074 - передано некорректное множество индексов
- SCL-20075 - количество индексов не совпадает с количеством строк
Все эти методы в ходе своей работы вызывают обработчики событий text:willReplaceStringAtIndex:withString: и text:didFinishReplacingStringAtIndex:withString: объекта делегирования соответствующего списка строк.
- Метод replaceString:withString: заменяет все вхождения указанной строки на заданную строку:
NSLog( @"%@", strings);
NSLog( @"%@", strings);
2016-08-24 01:19:18.207 libtest[2247:189321] Strings list count=4, case sensitive, modified: (
String 00
String 01
String 02
String 01
)
2016-08-24 01:19:18.208 libtest[2247:189321] Strings list count=4, case sensitive, modified: (
String 00
=========
String 02
=========
)
Метод вызывает обработчики событий text:willReplaceString:withString: и text:didFinishReplacingString:withString: назначенного экземпляру класса объекта делегирования.
Копирование и перемещение строк
Класс SCStrings является не просто контейнером для хранения различных строк, но и предоставляет достаточно мощные средства для построчной обработки своего содержимого. К этим средствам относятся такие методы класса, как:
- (void)exchangeStringAtIndex:(
SCIndex)index withStringAtIndex:(
SCIndex)destination;
- (void)duplicateStringAtIndex:(
SCIndex)index;
- (void)duplicateAllStrings;
- (void)duplicate;
- (void)copyStringAtIndex:(
SCIndex)index toIndex:(
SCIndex)destination;
- (void)moveStringAtIndex:(
SCIndex)index toIndex:(
SCIndex)destination;
- (void)forwardMoveStringAtIndex:(
SCIndex)index;
- (void)backwardMoveStringAtIndex:(
SCIndex)index steps:(
SCIndex)steps;
- (void)backwardMoveStringAtIndex:(
SCIndex)index;
- (void)moveToFirstPositionStringAtIndex:(
SCIndex)index;
- (void)moveToLastPositionStringAtIndex:(
SCIndex)index;
Обращаем внимание, что вызов любого из этих методов для находящегося в режиме "только для чтения" списка строк вызывает генерацию исключительной ситуации SCL-20063. Кроме этой ошибки возможно возникновение и других ошибок, характерных как для всей группы методов, так и для конкретных методов. При рассмотрении методов мы будем указывать на исключительные ситуации, которые могут возникнуть в ходе работы.
- Метод exchangeStringAtIndex:withStringAtIndex: меняет местами строки по указанным индексам. Если один или оба индекса заданы некорректно, возникает ошибка SCL-20072.
NSLog( @"%@", strings);
NSLog( @"%@", strings);
2016-08-24 13:38:16.972 libtest[6326:491362] Strings list count=4, case sensitive, modified: (
String 00
String 01
String 02
String 03
)
2016-08-24 13:38:16.972 libtest[6326:491362] Strings list count=4, case sensitive, modified: (
String 03
String 01
String 02
String 00
)
Во время работы метод вызывает обработчики событий text:willExchangeStringAtIndex:withStringAtIndex: и text:didFinishExchangingStringAtIndex:withStringAtIndex: объекта делегирования.
- Метод duplicateStringAtIndex: дублирует строку с указанным индексом. Если методу передан некорректный индекс, генерируется исключительная ситуация SCL-20072. При наличии у списка строк объекта делегирования вызываются его обработчики событий text:willDuplicateStringAtIndex: и text:didFinishDuplicatingStringAtIndex:.
NSLog( @"%@", strings);
NSLog( @"%@", strings);
2016-08-24 13:43:58.127 libtest[6393:495594] Strings list count=3, case sensitive, modified: (
String 00
String 01
String 02
)
2016-08-24 13:43:58.127 libtest[6393:495594] Strings list count=4, case sensitive, modified: (
String 00
String 01
String 01
String 02
)
- Метод duplicateAllStrings выполняет дублирование каждой строки, содержащейся в тексте, то есть после завершения работы данного метода каждая исходная строка находится в списке два раза:
NSLog( @"%@", strings);
NSLog( @"%@", strings);
2016-08-24 13:48:49.083 libtest[6422:499466] Strings list count=2, case sensitive, modified: (
String 00
String 01
)
2016-08-24 13:48:49.083 libtest[6422:499466] Strings list count=4, case sensitive, modified: (
String 00
String 00
String 01
String 01
)
- Метод duplicate осуществляет дублирование списка строк, то есть после выполнения метода в получившемся списке строк содержатся два последовательно идущих исходных списка строк. При этом вызываются обработчики событий willDuplicateText: и didFinishDuplicatingText:.
NSLog( @"%@", strings);
NSLog( @"%@", strings);
2016-08-24 13:53:55.418 libtest[6496:502939] Strings list count=2, case sensitive, modified: (
String 00
String 01
)
2016-08-24 13:53:55.419 libtest[6496:502939] Strings list count=4, case sensitive, modified: (
String 00
String 01
String 00
String 01
)
- Метод copyStringAtIndex:toIndex: копирует (то есть создает копию) строки с заданным индексом по указанному индексу. Если один из индексов задан некорректно, генерируется исключительная ситуация SCL-20072.
NSLog( @"%@", strings);
NSLog( @"%@", strings);
2016-08-24 14:12:07.287 libtest[6593:512651] Strings list count=3, case sensitive, modified: (
String 00
String 01
String 02
)
2016-08-24 14:12:07.287 libtest[6593:512651] Strings list count=4, case sensitive, modified: (
String 00
String 01
String 02
String 00
)
- Метод moveStringAtIndex:toIndex: перемещает строку с указанным индексом на позицию с заданным индексом. Если какой-либо из индексов является ошибочным, возникает исключительная ситуация SCL-20072.
NSLog( @"%@", strings);
NSLog( @"%@", strings);
2016-08-24 14:17:59.595 libtest[6650:516640] Strings list count=3, case sensitive, modified: (
String 00
String 01
String 02
)
2016-08-24 14:17:59.595 libtest[6650:516640] Strings list count=3, case sensitive, modified: (
String 01
String 00
String 02
)
- Метод forwardMoveStringAtIndex:steps: перемещает строку с указанным индексом на заданное количество позиций вперед, то есть к началу списка. Если указан некорректный индекс, генерируется ошибка SCL-20072.
NSLog( @"%@", strings);
NSLog( @"%@", strings);
2016-08-24 14:20:22.611 libtest[6676:518826] Strings list count=4, case sensitive, modified: (
String 00
String 01
String 02
String 03
)
2016-08-24 14:20:22.611 libtest[6676:518826] Strings list count=4, case sensitive, modified: (
String 00
String 03
String 01
String 02
)
- Метод forwardMoveStringAtIndex: перемещает строку с заданным индексом на одну позицию к началу списка. При обнаружении некорректного индекса возникает ошибка SCL-20072.
NSLog( @"%@", strings);
NSLog( @"%@", strings);
2016-08-24 14:21:37.611 libtest[6698:519861] Strings list count=4, case sensitive, modified: (
String 00
String 01
String 02
String 03
)
2016-08-24 14:21:37.611 libtest[6698:519861] Strings list count=4, case sensitive, modified: (
String 00
String 01
String 03
String 02
)
- Метод backwardMoveStringAtIndex:steps: перемещает строку с указанным индексом на заданное количество позиций назад, то есть к концу списка. Передача в качестве параметра метода ошибочного индекса приводит к генерации исключительной ситуации SCL-20072.
NSLog( @"%@", strings);
NSLog( @"%@", strings);
2016-08-24 14:23:00.079 libtest[6724:521210] Strings list count=4, case sensitive, modified: (
String 00
String 01
String 02
String 03
)
2016-08-24 14:23:00.080 libtest[6724:521210] Strings list count=4, case sensitive, modified: (
String 01
String 02
String 00
String 03
)
- Метод backwardMoveStringAtIndex: перемещает строку с заданным индексом на одну позицию к концу списка. При некорректном индексе генерируется исключительная ситуация SCL-20072.
NSLog( @"%@", strings);
NSLog( @"%@", strings);
2016-08-24 14:24:30.016 libtest[6749:522972] Strings list count=4, case sensitive, modified: (
String 00
String 01
String 02
String 03
)
2016-08-24 14:24:30.016 libtest[6749:522972] Strings list count=4, case sensitive, modified: (
String 01
String 00
String 02
String 03
)
- Метод moveToFirstPositionStringAtIndex: перемещает строку с заданным индексом в начало списка. Некорректный индекс вызывает ошибку SCL-20072.
NSLog( @"%@", strings);
NSLog( @"%@", strings);
2016-08-24 14:27:06.722 libtest[6780:525408] Strings list count=4, case sensitive, modified: (
String 00
String 01
String 02
String 03
)
2016-08-24 14:27:06.723 libtest[6780:525408] Strings list count=4, case sensitive, modified: (
String 02
String 00
String 01
String 03
)
- Метод moveToLastPositionStringAtIndex: перемещает строку с указанным индексом в конец списка:
NSLog( @"%@", strings);
NSLog( @"%@", strings);
2016-08-24 14:29:06.049 libtest[6808:527087] Strings list count=4, case sensitive, modified: (
String 00
String 01
String 02
String 03
)
2016-08-24 14:29:06.049 libtest[6808:527087] Strings list count=4, case sensitive, modified: (
String 00
String 02
String 03
String 01
)
К методам перемещения строк относятся и методы, которые отвечают за реверсирование списка строк, то есть методы, изменяющие порядок следования строк на обратный:
@property (nonatomic, retain, readonly, getter=reversedStrings)
SCStrings *reversedStrings;
- (void)reverse;
- Метод reverse изменяет порядок следования строк в списке на противоположный. При попытке вызова метода для списка строк в режиме "только для чтения" генерируется исключительная ситуация SCL-20063.
NSLog( @"%@", strings);
NSLog( @"%@", strings);
2016-08-24 14:40:51.589 libtest[6841:532216] Strings list count=3, case sensitive, modified: (
String 00
String 01
String 02
)
2016-08-24 14:40:51.589 libtest[6841:532216] Strings list count=3, case sensitive, modified: (
String 02
String 01
String 00
)
- Свойство reversedStrings возвращает список строк в обратном порядке:
NSLog( @"%@", strings);
NSLog( @"%@", strings);
2016-08-24 14:42:51.731 libtest[6870:534026] Strings list count=3, case sensitive, modified: (
String 00
String 01
String 02
)
2016-08-24 14:42:51.732 libtest[6870:534026] Strings list count=3, case sensitive, modified: (
String 02
String 01
String 00
)
2016-08-24 14:42:51.732 libtest[6870:534026] Strings list count=3, case sensitive, modified: (
String 00
String 01
String 02
)
Доступ к строкам
Для доступа к строкам списки на основе класса SCStrings могут быть использованы следующие методы и свойства:
@property (nonatomic, retain, readonly, getter=firstString) NSString *firstString;
@property (nonatomic, retain, readonly, getter=lastString) NSString *lastString;
- (NSString *)firstString;
- (NSString *)lastString;
- (NSString *)stringAtIndex:(
SCIndex)index;
- (
SCStrings *)stringsAtIndexes:(NSIndexSet *)indexes;
- Свойства firstString и lastString возвращают первую и последнюю строки списка соответственно или нулевой указатель, если список строк пуст:
NSLog( @"Last string: %@", [strings lastString]);
2016-08-24 16:57:05.557 libtest[8024:633793] First string: String 00
2016-08-24 16:57:05.557 libtest[8024:633793] Last string: String 02
- Метод stringAtIndex: возвращает строку с указанным индексом. При передаче методу несуществующего в списке индекса генерируется исключительная ситуация SCL-20072.
NSLog( @"String #1: %@", [strings stringAtIndex:1]);
2016-08-24 16:58:22.969 libtest[8056:634576] String #1: String 01
- Метод stringsAtIndexes: возвращает список строк, в который входят только строки с индексами из заданного множества индексов. Некорректные индексы во множестве игнорируются.
NSMutableIndexSet *indexSet = [NSMutableIndexSet indexSet];
[indexSet addIndex:0];
[indexSet addIndex:2];
NSLog( @"%@", [strings stringsAtIndexes:indexSet]);
2016-08-24 17:12:52.958 libtest[8093:640827] Strings list count=2, case sensitive, modified: (
String 00
String 02
)
Поиск строк
Класс SCStrings и его потомки предоставляют в распоряжение программистов множество методов поиска и выбора строк на основании различных критериев. В данном параграфе мы подробно рассмотрим такие средства, как:
- проверка наличия строк
- определение индексов строк
- выборка строк
- подсчет количества строк
При осуществлении операций поиска список строк учитывает значение свойства caseInsensitive. Если это свойство установлено в NO, то список строк игнорирует разницу в регистре символом.
Для выполнения проверок на наличие строк по различным критериям класс SCStrings декларирует следующие методы:
- (BOOL)containsString:(NSString *)string;
- (BOOL)containsStrings:(
SCStrings *)strings;
- (BOOL)containsAnyString:(
SCStrings *)strings;
- (BOOL)containsAnyStringFromCollection:(
id<
SCCollection>)collection;
- (BOOL)containsSubstring:(NSString *)substring;
- (BOOL)containsSubstrings:(
SCStrings *)substrings;
- (BOOL)containsSubstringsFromCollection:(
id<
SCCollection>)collection;
- (BOOL)containsAnySubstring:(
SCStrings *)substrings;
- (BOOL)containsAnySubstringFromCollection:(
id<
SCCollection>)collection;
- (BOOL)containsDuplicatedStrings;
- Метод containsString: проверяет наличие в списке указанной строки. Если заданная строка содержится в списке, метод возвращает значение YES, а при отсутствии искомой строки возвращает значение NO.
NSLog( @"String 02: %d", [strings containsString:@"String 02"]);
NSLog( @"String 04: %d", [strings containsString:@"String 04"]);
2016-08-24 17:44:57.417 libtest[8372:666502] String 02: 1
2016-08-24 17:44:57.417 libtest[8372:666502] String 04: 0
- Метод containsStrings: возвращает значение YES в том случае, когда список строк содержит все строки из указанного в качестве аргумента метода списка строк. Если хотя бы одна строка из второго списка отсутствует, метод возвращает значение NO.
NSLog( @"%d", [strings containsStrings:list]);
NSLog( @"%d", [strings containsStrings:list]);
2016-08-24 17:46:33.611 libtest[8398:667740] 1
2016-08-24 17:46:33.611 libtest[8398:667740] 0
- Метод containsCollection: дейстует аналогично методу containsStrings:, но вместо списка строк в качестве аргумента принимает коллекцию любого поддерживаемого библиотекой типа. Если в коллекции содержатся отличные от строк объекты, метод генерирует исключительную ситуацию SCL-20066.
NSLog( @"%d", [strings containsCollection:array]);
[array removeObject:@"String 04"];
NSLog( @"%d", [strings containsCollection:array]);
2016-08-24 17:48:20.922 libtest[8427:668985] 0
2016-08-24 17:48:20.922 libtest[8427:668985] 1
- Метод containsAnyString: возвращает значение YES, если список содержит хотя бы одну строку из указанного в качестве аргумента метода списка строк. Если в списке строк нет ни одной искомой строки, метод возвращает значение NO.
NSLog( @"%d", [strings containsAnyString:list]);
NSLog( @"%d", [strings containsAnyString:list]);
2016-08-24 17:50:06.494 libtest[8459:670543] 0
2016-08-24 17:50:06.494 libtest[8459:670543] 1
- Метод containsAnyStringFromCollection: является аналогом метода containsAnyString:, но в качестве аргумента вместо списка строк принимает коллекцию любого поддерживаемого библиотекой типа. При обнаружении в коллекции отличных от строк объектов метод завершается с ошибкой SCL-20066.
NSLog( @"%d", [strings containsAnyStringFromCollection:array]);
[array removeObject:@"String 02"];
NSLog( @"%d", [strings containsAnyStringFromCollection:array]);
2016-08-24 17:51:26.539 libtest[8485:671299] 1
2016-08-24 17:51:26.539 libtest[8485:671299] 0
- Метод containsSubstring: проверяет наличие в списке хотя бы одной строки, которая содержит указанную подстроку:
NSLog( @"%d", [strings containsSubstring:@"ing 0"]);
NSLog( @"%d", [strings containsSubstring:@"ing 1"]);
2016-08-24 17:52:47.962 libtest[8506:672089] 1
2016-08-24 17:52:47.962 libtest[8506:672089] 0
- Метод containsSubstrings: возвращает значение YES, если в списке строк есть подстроки из указанного в качестве аргумента метода списка строк. Если хотя бы одна из подстрок отсутствует, метод возвращает значение NO.
NSLog( @"%d", [strings containsSubstrings:substrings]);
NSLog( @"%d", [strings containsSubstrings:substrings]);
2016-08-24 17:55:11.683 libtest[8540:673775] 1
2016-08-24 17:55:11.683 libtest[8540:673775] 0
- Метод containsSubstringsFromCollection: проверяет наличие в списке строк подстрок из указанной коллекции любого поддерживаемого библиотекой типа. Если метод обнаруживает в коллекции отличные от строк объекты, вызывается исключительная ситуация SCL-20066.
NSLog( @"%d", [strings containsSubstringsFromCollection:array]);
[array removeObject:@"ing 1"];
NSLog( @"%d", [strings containsSubstringsFromCollection:array]);
2016-08-24 17:58:32.496 libtest[8571:675866] 0
2016-08-24 17:58:32.497 libtest[8571:675866] 1
- Метод containsAnySubstring: возвращает значение YES при наличии в списке строк хотя бы одного вхождения любой из подстрок, содержащихся в указанном в качестве аргумента метода списке строк:
NSLog( @"%d", [strings containsAnySubstring:substrings]);
NSLog( @"%d", [strings containsAnySubstring:substrings]);
2016-08-24 18:08:59.204 libtest[8614:680443] 1
2016-08-24 18:08:59.204 libtest[8614:680443] 0
- Метод containsAnySubstringFromCollection: действует аналогично методу containsAnySubstring:, но вместо списка подстрок принимает в качестве аргумента коллекцию любого поддерживаемого библиотекой типа. Если метод обнаруживает в коллекции отличные от строк объекты, генерируется исключительная ситуация SCL-20066.
NSLog( @"%d", [strings containsAnySubstringFromCollection:array]);
[array addObject:@"ing 0"];
NSLog( @"%d", [strings containsAnySubstringFromCollection:array]);
2016-08-24 18:10:31.861 libtest[8643:681782] 0
2016-08-24 18:10:31.861 libtest[8643:681782] 1
- Метод containsDuplicatedStrings возвращает значение YES, если хотя бы одна строка в списке встречается более одного раза:
NSLog( @"%d", [strings containsDuplicatedStrings]);
NSLog( @"%d", [strings containsDuplicatedStrings]);
2016-08-24 18:11:27.468 libtest[8663:682395] 0
2016-08-24 18:11:27.469 libtest[8663:682395] 1
Для определения индексов строк класс SCStrings объявляет следующие методы:
@property (nonatomic, assign, readonly, getter=indexOfLastString)
SCIndex indexOfLastString;
- (
SCIndex)indexOfString:(NSString *)string;
- (
SCIndex)indexOfSubstring:(NSString *)substring;
- Метод indexOfString: возвращает индекс указанной строки. Если искомая строка отсутствует в списке, метод возвращает значение NSNotFound.
NSLog( @"Index of String 02: %d", [strings indexOfString:@"String 02"]);
NSLog( @"Index of String 04: %d", [strings indexOfString:@"String 04"]);
2016-08-24 18:12:42.969 libtest[8688:683112] Index of String 02: 2
2016-08-24 18:12:42.969 libtest[8688:683112] Index of String 04: -1
- Свойство indexOfLastString возвращает индекс последней строки в списке:
2016-08-24 18:13:19.890 libtest[8704:683568] 2
- Метод indexOfSubstring: возвращает индекс строки, в которой обнаружено первое вхождение заданной подстроки. Если подстрока не найдена, возвращается значение NSNotFound.
NSLog( @"%d", [strings indexOfSubstring:@"ing 0"]);
NSLog( @"%d", [strings indexOfSubstring:@"ing 1"]);
2016-08-24 18:14:16.863 libtest[8724:684339] 0
2016-08-24 18:14:16.863 libtest[8724:684339] -1
Выборка строк - это процесс формирования нового списка строк на основании каких-либо критериев отбора исходных строк. Класс SCStrings предоставляет широкий набор методов выборки, декларируя их следующим образом:
- (
SCStrings *)stringsWithSubstring:(NSString *)substring;
- (
SCStrings *)stringsWithoutSubstring:(NSString *)substring;
- Метод stringsWithSubstring: возвращает список строк, которые в исходном списке строк содержат заданную подстроку:
NSLog( @"%@", [strings stringsWithSubstrings:substrings]);
NSLog( @"%@", [strings stringsWithSubstrings:substrings]);
2016-08-24 18:27:24.137 libtest[8957:693111] Strings list count=2, case sensitive, modified: (
String 010
String 012
)
2016-08-24 18:27:24.137 libtest[8957:693111] Strings list count=0, case sensitive: (
)
- Метод stringsWithSubstrings: формирует список из строк, которые содержат все подстроки из заданного списка:
NSLog( @"%@", [strings stringsWithSubstrings:substrings]);
NSLog( @"%@", [strings stringsWithSubstrings:substrings]);
2016-08-24 18:27:24.137 libtest[8957:693111] Strings list count=2, case sensitive, modified: (
String 010
String 012
)
2016-08-24 18:27:24.137 libtest[8957:693111] Strings list count=0, case sensitive: (
)
- Метод stringsWithSubstringsFromCollection: возвращает список строк, которые содержат все подстроки из указанной коллекции любого поддерживаемого библиотекой типа. Если при обработке коллекции будет обнаружен отличный от строки объект, произойдет генерация исключительной ситуации SCL-20066.
NSLog( @"%@", [strings stringsWithSubstringsFromCollection:array]);
[array addObject:@"2"];
NSLog( @"%@", [strings stringsWithSubstringsFromCollection:array]);
2016-08-24 18:29:19.441 libtest[8995:694772] Strings list count=2, case sensitive, modified: (
String 100
String 110
)
2016-08-24 18:29:19.441 libtest[8995:694772] Strings list count=0, case sensitive: (
)
- Метод stringsWithAnySubstring: формирует список из строк, которые содержат хотя бы одну подстроку из переданного в качестве аргумента метода списка подстрок:
NSLog( @"%@", [strings stringsWithAnySubstring:substrings]);
2016-08-24 18:37:24.801 libtest[9060:699391] Strings list count=2, case sensitive, modified: (
String 00
String 20
)
- Метод stringsWithAnySubstringFromCollection: возвращает строки, содержащие хотя бы одну из подстрок из заданной коллекции любого поддерживаемого библиотекой типа. При попытке передать в качестве аргумента метода коллекции с отличными от строк объектами генерируется исключительная ситуация SCL-20066.
NSLog( @"%@", [strings stringsWithAnySubstringFromCollection:array]);
2016-08-24 18:39:29.433 libtest[9089:700616] Strings list count=2, case sensitive, modified: (
String 10
String 30
)
- Метод stringsWithoutSubstring: формирует список строк, которые не содержат указанной подстроки:
NSLog( @"%@", [strings stringsWithoutSubstring:@"Line"]);
2016-08-24 18:40:50.606 libtest[9114:701616] Strings list count=2, case sensitive, modified: (
String 00
String 10
)
- Метод stringsWithoutSubstrings: возвращает список строк, не содержащих подстрок из указанного списка:
NSLog( @"%@", [strings stringsWithoutSubstrings:substrings]);
2016-08-24 18:43:40.661 libtest[9149:703742] Strings list count=2, case sensitive, modified: (
Message 40
Message 50
)
- Метод stringsWithoutSubstringsFromCollection: формирует список строк, которые не содержат подстрок из заданной коллекции любого поддерживаемого библиотекой типа. Если коллекция содержит отличные от строк объекты, генерируется исключительная ситуация SCL-20066.
NSLog( @"%@", [strings stringsWithoutSubstringsFromCollection:array]);
2016-08-24 18:45:09.315 libtest[9175:705009] Strings list count=4, case sensitive, modified: (
String 00
String 10
Message 40
Message 50
)
Подсчет строк осуществляется следующими методами класса SCStrings:
- (
SCULong)countOfString:(NSString *)string;
- (
SCULong)countOfSubstring:(NSString *)substring;
- (
SCULong)countOfStringsWithSubstring:(NSString *)substring;
- Метод countOfString: возвращает количество вхождений в список указанной строки:
NSLog( @"Count of String 00: %d", [strings countOfString:@"String 00"]);
NSLog( @"Count of String 02: %d", [strings countOfString:@"String 02"]);
NSLog( @"Count of String 04: %d", [strings countOfString:@"String 04"]);
2016-08-24 18:47:24.808 libtest[9206:706918] Count of String 00: 2
2016-08-24 18:47:24.808 libtest[9206:706918] Count of String 02: 1
2016-08-24 18:47:24.808 libtest[9206:706918] Count of String 04: 0
- Метод countOfSubstring: подсчитывает количество вхождений в строки списка заданной подстроки:
NSLog( @"%d", [strings countOfSubstring:@"0"]);
NSLog( @"%d", [strings countOfSubstring:@"1"]);
NSLog( @"%d", [strings countOfSubstring:@"4"]);
2016-08-24 18:49:38.833 libtest[9253:708280] 6
2016-08-24 18:49:38.833 libtest[9253:708280] 1
2016-08-24 18:49:38.833 libtest[9253:708280] 0
- Метод countOfStringsWithSubstring: определяет количество строк, которые содержат указанную подстроку. Отличие этого метода от метода countOfSubstring: состоит в том, что он возвращает именно количество строк, вне зависимости от того, сколько раз искомая подстрока входит в строку.
NSLog( @"%d", [strings countOfStringsWithSubstring:@"ing 00"]);
NSLog( @"%d", [strings countOfStringsWithSubstring:@"ing 02"]);
NSLog( @"%d", [strings countOfStringsWithSubstring:@"ing 04"]);
2016-08-24 18:54:11.586 libtest[9278:710720] 2
2016-08-24 18:54:11.586 libtest[9278:710720] 1
2016-08-24 18:54:11.586 libtest[9278:710720] 0
Списки уникальных строк
Класс SCUniqueStrings наследует от класса SCStrings всю функциональность списка строк, дополняя его средствами контроля за уникальностью добавляемой в список информации - списки уникальных строк не допускают дублирования хранящихся в них строках. Попытка добавить строку, которая уже присутствует в таком списке, в зависимости от значения свойства strongMode приводит либо к игнорированию добавляемой строки, либо вызывает генерацию исключительной ситуации SCL-20069 с указанием, какую из существующих строк дублирует новая.
Естественно, что унаследованные от класса SCStrings методы по копированию и дублированию строк в классе SCUniqueStrings перекрыты и также либо игнорируются, либо вызывают исключительную ситуацию SCL-20069.
Особо отметим, что как и класс-предок, SCUniqueStrings в зависимости от значения свойства caseInsensitive либо учитывает, либо не учитывает регистр символов. Важным моментом является поведение экземпляра класса при переключении значения этого свойства из NO в YES. При таком переключении может возникнуть ситуация, когда ранее считавшиеся разными строки в новом режиме будут признаны одинаковыми и либо строки с большими индексами будут удалены, либо будет сгенерирована исключительная ситуация SCL-20069.
[strings addString:@"String 00"];
[strings addString:@"string 00"];
2016-08-25 11:30:46.520 libtest[12212:1075882] SCL-20069: Duplicate string "string 00" at index 1
2016-08-25 11:30:46.520 libtest[12212:1075882] ==================================================
Поэтому мы рекомендуем с осторожностью изменять режим регистрозависимости для непустых списков уникальных строк.
При копировании данных из существующих обычных списков строк и коллекций дублирующие строки также будут либо удалены, либо будет сгенерирована ошибка.
Свойства экземпляров класса
В дополнение к унаследованным от предка свойствам класс SCUniqueStrings декларирует собственные свойства и методы доступа к ним:
@property (nonatomic, assign, getter=strongMode, setter=setStrongMode:) BOOL strongMode;
- (BOOL)strongMode;
- (void)setStrongMode:(BOOL)strongMode;
- Свойство strongMode определяет поведение списка уникальных строк при обнаружении дублированных строк. Если значение свойства установлено в NO, то экземпляр класса игнорирует дублирующие строки, не выполняя над ними заданные операции. В случае присвоения свойству значения YES список уникальных строк вместо игнорирования генерирует исключительную ситуацию SCL-20066.
Создание списков уникальных строк
Для создания списков уникальных строк на основании данных из последовательных файлов, словарей и потоков класс SCUniqueStrings декларирует следующие классовые методы:
+ (instancetype)uniqueStringsWithCoder:(NSCoder *)coder;
+ (instancetype)uniqueStringsWithContentsOfSerializedFile:(NSString *)path;
+ (instancetype)uniqueStringsWithDataDictionary:(NSDictionary *)dictionary;
+ (instancetype)uniqueStringsWithDataDictionaryFromFile:(NSString *)path;
+ (instancetype)uniqueStringsWithStream:(
SCStream *)stream;
+ (instancetype)uniqueStringsWithFileStream:(NSString *)path;
Создание экземпляров класса SCUniqueStrings осуществляется следующими классовыми методами:
+ (instancetype)uniqueStringsWithName:(NSString *)name;
+ (instancetype)uniqueStringsWithString:(NSString *)string;
+ (instancetype)uniqueStringsWithCollection:(
id<
SCCollection>)collection;
+ (instancetype)uniqueStringsWithStrings:(
SCStrings *)strings;
+ (instancetype)uniqueStringsWithUniqueStrings:(
SCUniqueStrings *)uniqueStrings;
+ (instancetype)uniqueStrings;
- Классовый метод uniqueStringsWithName: создает пустой список уникальных строк с заданным именем:
2016-08-25 11:54:17.175 libtest[12416:1086458] Unique strings list "Secret List" count=0, case sensitive, strong mode: (
)
- Классовый метод uniqueStringsWithString: возвращает неименованный список уникальных строк, содержащий указанную в качестве аргумента метода строку:
2016-08-25 11:54:50.474 libtest[12431:1086670] Unique strings list count=1, case sensitive, strong mode: (
Sample String
)
- Классовый метод uniqueStringsWithCollection: возвращает созданный неименованный список уникальных строк на основании существующей коллекции любого поддерживаемого библиотекой типа. При обнаружении в исходной коллекции дублирующих строк повторные строки игнорируются и не добавляются в создаваемый список уникальных строк. Если в коллекции будут обнаружены отличные от строк объекты, будет сгенерирована исключительная ситуация SCL-20066.
2016-08-25 11:57:51.089 libtest[12486:1087829] Unique strings list count=2, case sensitive, strong mode: (
String 00
String 01
)
- Классовый метод uniqueStringsWithStrings: создает список уникальных строк как копию существующего обычного списка строк. Обнаруженные дублирующие строки игнорируются и не добавляются в создаваемый список.
2016-08-25 11:57:08.451 libtest[12470:1087551] Unique strings list count=2, case sensitive, modified: (
String 00
String 10
)
- Классовый метод uniqueStringsWithUniqueStrings: создает копию существующего списка уникальных строк:
[source addString:@"String 00"];
[source addString:@"String 02"];
NSLog( @"%@", strings);
2016-08-25 11:59:00.013 libtest[12506:1088434] Unique strings list count=2, case sensitive, strong mode, modified: (
String 00
String 02
)
- Классовый метод uniqueStrings возвращает пустой неименованный список уникальных строк:
2016-08-25 11:59:41.193 libtest[12521:1088767] Unique strings list count=0, case sensitive, strong mode: (
)
Инициализация списков уникальных строк
Кроме унаследованных от SCStrings методов инициализации класс SCUniqueStrings объявляет собственные методы:
Копирование списков
Класс SCUniqueStrings дополняет унаследованные методы копирования экземпляров класса следующими собственными методами:
- Метод setUniqueStrings: заменяет настройки и содержимое списка уникальных строк на настройки и содержимое указанного в качестве аргумента метода списка уникальных строк:
[strings addString:@"Line 00"];
[strings addString:@"Line 01"];
NSLog( @"%@", strings);
[source addString:@"String 00"];
[source addString:@"String 10"];
[source addString:@"String 20"];
NSLog( @"%@", strings);
2016-08-25 12:01:07.514 libtest[12548:1089323] Unique strings list count=2, case sensitive, strong mode, modified: (
Line 00
Line 01
)
2016-08-25 12:01:07.514 libtest[12548:1089323] Unique strings list count=3, case sensitive, strong mode, modified: (
String 00
String 10
String 20
)
Сравнение списков
Класс CSUniqueStrings дополняет унаследованные методы сравнения следующими собственными методами:
Преобразование списков
Класс SCUniqueStrings дополняет унаследованные методы преобразования следующими собственными методами:
@property (nonatomic, retain, readonly, getter=strings)
SCStrings *strings;
@property (nonatomic, retain, readonly, getter=orderedSet)
SCOrderedSet *orderedSet;
@property (nonatomic, retain, readonly, getter=foundationOrderedSet) NSOrderedSet *foundationOrderedSet;
- (NSOrderedSet *)foundationOrderedSet;
- Свойство strings возвращает список уникальных строк в виде обычного списка строк.
- Свойство orderedSet преобразует список уникальных строк в библиотечное упорядоченное множество (экземпляр класса SCOrderedSet).
- Свойство foundationOrderedSet отвечает за преобразование списка уникальных строк в стандартное упорядоченное множество (NSOrderedSet).
Тексты
Класс SCText расширяет функциональные возможности класса SCStrings, добавляя к спискам строк методы для работы с текстовыми блоками - группами строк внутри списков строк. SCText обеспечивает выполнение таких операций, как добавление, вставка, удаление, копирование, перемещение и так далее. Именно данная дополнительная функциональность и делает из простого списка строк текст в том виде, в каком мы привыкли работать с текстами в текстовых редакторах.
Данная глава описывает методы работы с текстами и текстовыми блоками исходя из предположения, что Вы уже ознакомились с базовой функциональностью, реализованной в классе SCStrings.
Создание текстов
Класс SCText декларирует следующие классовые методы для создания экземпляров класса на основании данных из последовательных файлов, словарей и потоков:
+ (instancetype)textWithCoder:(NSCoder *)coder;
+ (instancetype)textWithContentsOfSerializedFile:(NSString *)path;
+ (instancetype)textWithDataDictionary:(NSDictionary *)dictionary;
+ (instancetype)textWithDataDictionaryFromFile:(NSString *)path;
+ (instancetype)textWithStream:(
SCStream *)stream;
+ (instancetype)textWithFileStream:(NSString *)path;
Для создания текстов могут быть использованы следующие классовые методы SCText:
+ (instancetype)textWithName:(NSString *)name;
+ (instancetype)textWithString:(NSString *)string;
+ (instancetype)textWithStrings:(
SCStrings *)strings;
+ (instancetype)textWithCollection:(
id<
SCCollection>)collection;
+ (instancetype)textWithText:(
SCText *)text;
+ (instancetype)text;
- Классовый метод textWithName: создает пустой текст с заданным именем:
2016-08-25 15:46:06.093 libtest[13585:1207335] Text "libtest.m" count=0, case sensitive: (
)
- Классовый метод textWithString: возвращает неименованный текст с указанной в качестве аргумента метода строкой:
2016-08-25 15:54:55.634 libtest[13621:1214447] Text count=1, case sensitive: (
#import <unistd.h>
)
- Классовый метод textWithStrings: возвращает текст, созданный на основе указанного существующего списка строк:
[strings
addString:@"#import <Foundation/Foundation.h>"];
NSLog( @"%@", text);
2016-08-25 15:57:28.111 libtest[13655:1215774] Text "libtest.m" count=5, case sensitive, modified: (
#import <unistd.h>
#import <fcntl.h>
#import <stdio.h>
#import <Foundation/Foundation.h>
#import <scl/scl.h>
)
- Классовый метод textWithCollection: создает текст со строками из указанной коллекции любого поддерживаемого библиотекой типа. Если в исходной коллекции будут обнаружены отличные от строк объекты, метод сгенерирует исключительную ситуацию SCL-20066.
[array addObject:@"#define SN @\"/tmp/stream.dat\""];
[array addObject:@"#define SF @\"/tmp/serial.plist\""];
[array addObject:@"#define DF @\"/tmp/data.plist\""];
NSLog( @"%@", text);
2016-08-25 16:02:27.150 libtest[13694:1217695] Text "libtest.m" count=3, case sensitive: (
#define SN @"/tmp/stream.dat"
#define SF @"/tmp/serial.plist"
#define DF @"/tmp/data.plist"
)
- Классовый метод textWithText: возвращает копию существующего текста:
[source
addString:@"int main (int argc, const char * argv[]) {"];
[source
addString:@" NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];"];
NSLog( @"%@", text);
2016-08-25 16:04:34.483 libtest[13731:1218850] Text "libtest.m" count=3, case sensitive, modified: (
int main (int argc, const char * argv[]) {
NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
}
)
- Классовый метод text создает пустой неименованный текст:
2016-08-25 16:05:20.724 libtest[13746:1219175] Text count=0, case sensitive: (
)
Инициализация текстов
Класс SCText дополняет инициализаторы родительского класса следующими методами:
- (instancetype)initWithText:(
SCText *)text;
Копирование текстов
Класс SCText дополняет класс SCStrings следующими методами копирования:
- (void)setText:(
SCText *)text;
- Метод setText: заменяет текущие содержимое и настройки текста на содержимое и настройки текста, указанного в качестве аргумента метода.
Сравнение текстов
Класс SCText декларирует следующие методы сравнения экземпляров класса:
- (BOOL)isEqualToText:(
SCText *)text;
Преобразование текстов
Класс SCText дополняет класс SCStrings следующими методами и свойствами для преобразования текстов:
@property (nonatomic, retain, readonly, getter=strings)
SCStrings *strings;
@property (nonatomic, retain, readonly, getter=uniqueStrings)
SCUniqueStrings *uniqueStrings;
- Свойство strings преобразует текст в список строк.
- Свойство uniqueStrings выполняет преобразование текста в список уникальных строк. Обнаруженные дублирующие строки в создаваемый список уникальных строк не включаются.
Добавление текста
Класс SCText декларирует следующие методы добавления текстов:
- Метод addText: добавляет заданный текст в конец исходного текста:
NSLog( @"%@", text);
NSLog( @"%@", text);
2016-08-25 17:29:36.666 libtest[14254:1266732] Text count=2, case sensitive, modified: (
String 00
String 01
)
2016-08-25 17:29:36.666 libtest[14254:1266732] Text count=5, case sensitive, modified: (
String 00
String 01
=========
String 10
String 11
)
- Метод insertText:atIndex: вставляет указанный текст по заданному индексу исходного текста:
NSLog( @"%@", text);
NSLog( @"%@", text);
2016-08-25 17:30:48.243 libtest[14277:1267118] Text count=2, case sensitive, modified: (
String 00
String 01
)
2016-08-25 17:30:48.243 libtest[14277:1267118] Text count=6, case sensitive, modified: (
String 00
=========
String 10
String 11
=========
String 01
)
Удаление текста
Класс SCText объявляет ряд методов для удаления текстовых блоков:
- (void)removeAllText;
- (void)removeTextInRange:(NSRange)range;
- (void)removeTextWithSubstring:(NSString *)substring;
- (void)removeTextWithoutSubstring:(NSString *)substring;
- (void)removeSubstring:(NSString *)substring;
- (
SCText *)cutTextInRange:(NSRange)range;
- Метод removeAllText удаляет из текста все хранившиеся в нем строки:
NSLog( @"%@", text);
NSLog( @"%@", text);
2016-08-25 17:46:39.848 libtest[14387:1275208] Text count=2, case sensitive, modified: (
String 00
String 01
)
2016-08-25 17:46:39.849 libtest[14387:1275208] Text count=0, case sensitive, modified: (
)
- Метод removeTextInRange: удаляет из текста строки в заданном диапазоне. Если методу передан некорректный диапазон, генерируется исключительная ситуация SCL-20073.
NSLog( @"%@", text);
NSLog( @"%@", text);
2016-08-25 17:47:29.378 libtest[14403:1275561] Text count=4, case sensitive, modified: (
String 00
String 01
String 02
String 03
)
2016-08-25 17:47:29.378 libtest[14403:1275561] Text count=2, case sensitive, modified: (
String 00
String 03
)
- Метод removeTextWithSubstring: удаляет из текста все строки, которые содержат указанную подстроку:
NSLog( @"%@", text);
NSLog( @"%@", text);
2016-08-25 17:49:04.118 libtest[14426:1276155] Text count=4, case sensitive, modified: (
String 00
String 10
String 11
String 20
)
2016-08-25 17:49:04.118 libtest[14426:1276155] Text count=2, case sensitive, modified: (
String 00
String 20
)
- Метод removeTextWithoutSubstring: удаляет из текста строки, которые не содержат заданную подстроку:
NSLog( @"%@", text);
NSLog( @"%@", text);
2016-08-25 17:50:16.963 libtest[14445:1276545] Text count=4, case sensitive, modified: (
String 00
String 10
String 11
String 20
)
2016-08-25 17:50:16.963 libtest[14445:1276545] Text count=2, case sensitive, modified: (
String 10
String 11
)
- Метод removeSubstring: удаляет из текста все вхождения заданной подстроки:
NSLog( @"%@", text);
NSLog( @"%@", text);
2016-08-25 17:58:06.016 libtest[14486:1279995] Text count=4, case sensitive, modified: (
File 00 Line 04
File 00 Line 08
Unit 10
Unit 10
)
2016-08-25 17:58:06.016 libtest[14486:1279995] Text count=4, case sensitive, modified: (
Line 04
Line 08
Unit 10
Unit 10
)
- Метод cutTextInRange: удаляет из текста строки в заданном диапазоне и возвращает их в виде текстового блока. Если методу передается некорректный диапазон, генерируется исключительная ситуация SCL-20073.
NSLog( @"%@", text);
NSLog( @"%@", text);
NSLog( @"%@", block);
2016-08-26 11:46:09.630 libtest[5117:300164] Text count=4, case sensitive, modified: (
String 00
String 10
String 20
String 30
)
2016-08-26 11:46:09.630 libtest[5117:300164] Text count=2, case sensitive, modified: (
String 00
String 30
)
2016-08-26 11:46:09.630 libtest[5117:300164] Text count=2, case sensitive, modified: (
String 10
String 20
)
- Метод removeText: удаляет из текста все вхождения заданного в качестве аргумента метода текстового блока:
NSLog( @"%@", text);
NSLog( @"%@", text);
2016-08-26 11:49:48.523 libtest[5156:302760] Text count=6, case sensitive, modified: (
String 01
String 02
String 03
String 04
String 02
String 03
)
2016-08-26 11:49:48.523 libtest[5156:302760] Text count=2, case sensitive, modified: (
String 01
String 04
)
Замена текста
Класс SCText декларирует следующие методы для замены текстовых блоков:
- (void)replaceTextInRange:(NSRange)range withText:(
SCStrings *)text;
- (void)replaceTextInRange:(NSRange)range withCollection:(
id<
SCCollection>)collection;
- Метод replaceTextInRange:withText: заменяет текст в заданном диапазоне на указанный текст. При обнаружении некорректного диапазона генерируется исключительная ситуация SCL-20073.
NSLog( @"%@", text);
NSLog( @"%@", text);
2016-08-26 13:15:53.283 libtest[5522:345794] Text count=4, case sensitive, modified: (
String 00
String 01
String 02
String 03
)
2016-08-26 13:15:53.283 libtest[5522:345794] Text count=4, case sensitive, modified: (
String 00
Line A
Line B
String 03
)
- Метод replaceTextInRange:withCollection: осуществляет замену текста в указанном диапазоне на строки из заданной коллекции любого поддерживаемого библиотекой типа:
NSLog( @"%@", text);
NSLog( @"%@", text);
2016-08-26 13:17:29.744 libtest[5548:346447] Text count=4, case sensitive, modified: (
String 00
String 01
String 02
String 03
)
2016-08-26 13:17:29.745 libtest[5548:346447] Text count=4, case sensitive, modified: (
String 00
Message 01
Message 02
String 03
)
При работе метода могут возникнуть следующие исключительные ситуации:
- SCL-20063 - текст находится в режиме "только для чтения"
- SCL-20066 - в коллекции обнаружены отличные от строк объекты
- SCL-20073 - некорректный диапазон заменяемого текста
- Метод replaceText:withText: меняет все вхождения указанного текстового блока на строки из заданного текстового блока:
NSLog( @"%@", text);
NSLog( @"%@", text);
2016-08-26 13:40:55.037 libtest[5690:358097] Text count=4, case sensitive, modified: (
String 00
String 01
String 02
String 03
)
2016-08-26 13:40:55.037 libtest[5690:358097] Text count=4, case sensitive, modified: (
String 00
Code 01
Code 02
String 03
)
Перемещение и копирование текста
Класс SCText дополняет методы копирования и перемещения строк класса SCStrings собственными методами по манипулированию текстовыми блоками:
- (void)exchangeTextInRange:(NSRange)source withTextInRange:(NSRange)destination;
- (void)duplicateTextInRange:(NSRange)range;
- (void)duplicateStringsInRange:(NSRange)range;
- (void)copyTextInRange:(NSRange)range toIndex:(
SCIndex)destination;
- (void)moveTextInRange:(NSRange)range toIndex:(
SCIndex)destination;
- (void)forwardMoveTextInRange:(NSRange)range steps:(
SCIndex)steps;
- (void)forwardMoveTextInRange:(NSRange)range;
- (void)backwardMoveTextInRange:(NSRange)range steps:(
SCIndex)steps;
- (void)backwardMoveTextInRange:(NSRange)range;
- (void)moveToFirstPositionTextInRange:(NSRange)range;
- (void)moveToLastPositionTextInRange:(NSRange)range;
- Метод exchangeTextInRange:withTextInRange: меняет местами два текстовых блока с указанными диапазонами. Если один или оба заданных диапазона являются некорректными, генерируется исключительная ситуация SCL-20073. Если указанные диапазоны корректны, однако пересекаются друг с другом (то есть конец одного диапазона является началом другого диапазона), метод вызывает ошибку SCL-20076.
NSLog( @"%@", text);
NSLog( @"%@", text);
2016-08-26 13:58:47.563 libtest[5889:370805] Text count=5, case sensitive, modified: (
String 00
String 01
String 02
String 03
String 04
)
2016-08-26 13:58:47.563 libtest[5889:370805] Text count=5, case sensitive, modified: (
String 03
String 04
String 02
String 00
String 01
)
- Метод duplicateTextInRange: создает копию текстового блока в указанном диапазоне и вставляет его в текст сразу после оригинального блока. Вызов метода для некорректного диапазона строк приводит к генерации исключительной ситуации SCL-20073.
NSLog( @"%@", text);
NSLog( @"%@", text);
2016-08-26 14:00:57.326 libtest[5917:371953] Text count=4, case sensitive, modified: (
String 00
String 01
String 02
String 03
)
2016-08-26 14:00:57.326 libtest[5917:371953] Text count=6, case sensitive, modified: (
String 00
String 01
String 02
String 01
String 02
String 03
)
- Метод duplicateStringsInRange: создает копию строки в текстовом блоке в указанном диапазоне, вставляя копию очередной строки блока сразу же после оригинальной строки. При попытке вызова метода с указанием некорректного диапазона строк генерируется исключительная ситуация SCL-20073.
NSLog( @"%@", text);
NSLog( @"%@", text);
2016-08-26 14:11:54.670 libtest[5947:376372] Text count=4, case sensitive, modified: (
String 00
String 01
String 02
String 03
)
2016-08-26 14:11:54.670 libtest[5947:376372] Text count=6, case sensitive, modified: (
String 00
String 01
String 01
String 02
String 02
String 03
)
- Метод copyTextInRange:toIndex: копирует текстовый блок с заданным диапазоном в указанную позицию:
NSLog( @"%@", text);
NSLog( @"%@", text);
2016-08-26 14:13:42.945 libtest[5969:377490] Text count=4, case sensitive, modified: (
String 00
String 01
String 02
String 03
)
2016-08-26 14:13:42.945 libtest[5969:377490] Text count=6, case sensitive, modified: (
String 00
String 01
String 02
String 00
String 01
String 03
)
При работе метода возможна генерация следующих исключительных ситуаций:
- SCL-20063 - текст находится в режиме "только для чтения"
- SCL-20073 - некорректный диапазон копируемого текста
- SCL-20074 - обнаружен некорректный индекс назначения
- Метод moveTextInRange:toIndex: перемещает текстовый блок с заданным диапазоном в указанную позицию:
NSLog( @"%@", text);
NSLog( @"%@", text);
2016-08-26 14:14:40.893 libtest[5991:378346] Text count=4, case sensitive, modified: (
String 00
String 01
String 02
String 03
)
2016-08-26 14:14:40.894 libtest[5991:378346] Text count=4, case sensitive, modified: (
String 02
String 00
String 01
String 03
)
При работе метода возможна генерация следующих исключительных ситуаций:
- SCL-20063 - текст находится в режиме "только для чтения"
- SCL-20073 - некорректный диапазон копируемого текста
- SCL-20074 - обнаружен некорректный индекс назначения
- Метод forwardMoveTextInRange:steps: перемещает текстовый блок в указанном диапазона на заданное количество строк вперед, то есть к началу текста. Если в ходе перемещения блока достигается начало текста, то процесс перемещения останавливается. При попытке передать методу некорректный диапазон строк генерируется исключительная ситуация SCL-20073.
NSLog( @"%@", text);
NSLog( @"%@", text);
2016-08-26 14:16:55.120 libtest[6069:380309] Text count=5, case sensitive, modified: (
String 00
String 01
String 02
String 03
String 04
)
2016-08-26 14:16:55.120 libtest[6069:380309] Text count=5, case sensitive, modified: (
String 00
String 03
String 04
String 01
String 02
)
- Метод forwardMoveTextInRange: (SCText) перемещает текстовый блок с заданным диапазоном на одну строку вверх, то есть к началу текста. Вызов метода с некорректным диапазоном приводит к генерации исключительной ситуации SCL-20073.
NSLog( @"%@", text);
NSLog( @"%@", text);
2016-08-26 14:17:47.431 libtest[6087:381042] Text count=5, case sensitive, modified: (
String 00
String 01
String 02
String 03
String 04
)
2016-08-26 14:17:47.431 libtest[6087:381042] Text count=5, case sensitive, modified: (
String 00
String 01
String 03
String 04
String 02
)
- Метод backwardMoveTextInRange:steps: перемещает текстовый блок с указанным диапазоном на заданное число позиций вниз (к концу текста). При достижении блоком конца текста процесс перемещения останавливается. Если методу передан некорректный диапазон, генерируется исключительная ситуация SCL-20073.
NSLog( @"%@", text);
NSLog( @"%@", text);
2016-08-26 14:18:47.713 libtest[6109:382063] Text count=5, case sensitive, modified: (
String 00
String 01
String 02
String 03
String 04
)
2016-08-26 14:18:47.714 libtest[6109:382063] Text count=5, case sensitive, modified: (
String 02
String 03
String 00
String 01
String 04
)
- Метод backwardMoveTextInRange: перемещает текстовый блок с указанным диапазоном на одну позицию к концу текста. Если метод обнаруживает некорректный диапазон перемещаемого блока, генерируется исключительная ситуация SCL-20073.
NSLog( @"%@", text);
NSLog( @"%@", text);
2016-08-26 14:19:44.506 libtest[6129:382844] Text count=5, case sensitive, modified: (
String 00
String 01
String 02
String 03
String 04
)
2016-08-26 14:19:44.507 libtest[6129:382844] Text count=5, case sensitive, modified: (
String 02
String 00
String 01
String 03
String 04
)
- Метод moveToFirstPositionTextInRange: перемещает текстовый блок с заданным диапазоном в начало текста:
NSLog( @"%@", text);
NSLog( @"%@", text);
2016-08-26 14:22:47.602 libtest[6158:384433] Text count=4, case sensitive, modified: (
String 00
String 01
String 02
String 03
)
2016-08-26 14:22:47.602 libtest[6158:384433] Text count=4, case sensitive, modified: (
String 01
String 02
String 00
String 03
)
- Метод moveToLastPositionTextInRange: осуществляет перемещение текстового блока с указанным диапазоном в конец текста:
NSLog( @"%@", text);
NSLog( @"%@", text);
2016-08-26 14:24:30.248 libtest[6179:385644] Text count=4, case sensitive, modified: (
String 00
String 01
String 02
String 03
)
2016-08-26 14:24:30.248 libtest[6179:385644] Text count=4, case sensitive, modified: (
String 00
String 03
String 01
String 02
)
Доступ к тексту
Методы доступа к тексту являются важным дополнением к методам доступа к строкам, которые класс SCText унаследовал от класса SCStrings. На сегодняшний день к методам доступа к тексту относятся следующие методы:
- (
SCText *)textInRange:(NSRange)range;
- Метод textInRange: возвращает текстовый блок в указанном диапазоне строк. При работе метода при передаче некорректного диапазона строк возможна генерация исключительной ситуации SCL-20073.
NSLog( @"%@", [text textInRange:NSMakeRange(1, 2)]);
2016-08-26 15:44:52.005 libtest[6677:432494] Text count=2, case sensitive, modified: (
String 01
String 02
)
Поиск и выбор строк
Класс SCText дополняет механизмы поиска строк класса SCStrings собственными методами поиска текстовых блоков:
- (
SCTextIndex *)textIndexOfSubstring:(NSString *)substring;
- (
SCArray *)textIndexesOfSubstring:(NSString *)substring;
Обращаем внимание, что работа данных методов зависит от значения свойства caseInsensitive.
- Метод containsText: определяет наличие в исходном тексте указанного текстового блока. Если текст содержит хотя бы одно вхождение текстового блока, возвращается значение YES. Если искомый текстовый блок отсутствует в тексте, возвращается значение NO.
NSLog( @"%d", [text containsText:block]);
NSLog( @"%d", [text containsText:block]);
2016-08-29 13:07:35.722 libtest[3822:832971] 1
2016-08-29 13:07:35.722 libtest[3822:832971] 0
- Метод rangeOfText: возвращает диапазон первого вхождения в текст указанного текстового блока. Если текстовый блок не входит в текст, метод возвращает нулевой диапазон (0, 0).
NSLog( @"(%d, %d)", [text rangeOfText:block]);
NSLog( @"(%d, %d)", [text rangeOfText:block]);
2016-08-29 13:09:51.106 libtest[3847:834973] (1, 2)
2016-08-29 13:09:51.106 libtest[3847:834973] (0, 0)
- Метод rangeOfCollection: аналогичен методу rangeOfText:, только вместо списка строк в качестве аргумента принимает коллекцию любого поддерживаемого библиотекой типа.
- Метод indexOfText: возвращает индекс первого вхождения в текст указанного текстового блока. Если искомый блок отсутствует в тексте, метод возвращает значение NSNotFound.
NSLog( @"%d", [text indexOfText:block]);
NSLog( @"%d", [text indexOfText:block]);
2016-08-29 13:12:43.591 libtest[3870:837964] 1
2016-08-29 13:12:43.591 libtest[3870:837964] -1
- Метод indexOfCollection: отличается от метода indexOfText: тем, что вместо списка строк в качестве аргумента воспринимает коллекцию любого поддерживаемого библиотекой типа.
- Метод countOfText: возвращает количество вхождений в текст указанного текстового блока:
NSLog( @"%d", [text countOfText:block]);
NSLog( @"%d", [text countOfText:block]);
2016-08-29 13:16:13.767 libtest[3899:842027] 2
2016-08-29 13:16:13.767 libtest[3899:842027] 0
- Метод countOfCollection: возвращает количество вхождений в текст группы строк из заданной коллекции любого поддерживаемого библиотекой типа, являясь таким образом аналогом метода countOfText:.
- Метод indexesOfText: возвращает массив индексов, по которым был найден заданный текстовый блок:
NSLog( @"%@", [text indexesOfText:block]);
NSLog( @"%@", [text indexesOfText:block]);
2016-08-29 13:19:15.702 libtest[3939:845663] Array count=2: (
"1",
"4"
)
2016-08-29 13:19:15.702 libtest[3939:845663] Array count=0:
)
- Метод indexesOfCollection: работает аналогично методу indexesOfText: за исключением того, что в качестве аргумента он воспринимает коллекцию любого поддерживаемого библиотекой типа.
- Метод textIndexOfSubstring: возвращает текстовый индекс первого вхождения заданной подстроки:
NSLog( @"%@", [text textIndexOfSubstring:@"ing 02"]);
NSLog( @"%@", [text textIndexOfSubstring:@"ing 04"]);
2016-08-29 13:25:29.845 libtest[3970:853405] (2, 3)
2016-08-29 13:25:29.845 libtest[3970:853405] (null)
- Метод textIndexesOfSubstring: возвращает список текстовых индексов всех вхождений в текст заданной подстроки:
NSLog( @"%@", [text textIndexesOfSubstring:@"ing 02"]);
NSLog( @"%@", [text textIndexesOfSubstring:@"ing 04"]);
2016-08-29 13:40:10.715 libtest[3997:865041] Array count=2: (
"(2, 3)",
"(5, 3)"
)
2016-08-29 13:40:10.715 libtest[3997:865041] Array count=0:
)
Отбор текстовых блоков по различным критериям в дополнение к уже имеющимся методам класса SCStrings в классе SCText осуществляют следующие методы:
- (
SCText *)textWithSubstring:(NSString *)substring;
- (
SCText *)textWithoutSubstring:(NSString *)substring;
Напоминаем, что поведение данных методов зависит от значения свойства caseInsensitive.
- Метод textWithSubstring: возвращает текстовый блок, который содержит строки, в состав которых хотя бы один раз входит указанная в качестве параметра подстрока:
NSLog( @"%@", [text textWithSubstring:@"ing 0"]);
2016-08-29 13:52:03.303 libtest[4047:873961] Text count=2, case sensitive, modified: (
String 00
String 01
)
- Метод textWithoutSubstring: возвращает текстовый блок из строк, которые не содержат заданную подстроку:
NSLog( @"%@", [text textWithoutSubstring:@"ing 0"]);
2016-08-29 14:13:54.307 libtest[4093:893355] Text count=2, case sensitive, modified: (
String 10
String 11
)
Текстовые файлы
Класс SCTextFile дополняет функциональность родительского класса SCText возвожностями по работе с файлами на диске. Прежде всего это операции загрузки текстов из файлов, запись текстов в файлы, а также операции по чтению и записи отдельных текстовых блоков. При этом класс SCTextFile сохраняет всю фунциональность списков строк и текстов.
Свойства экземпляров класса
Наиболее важными свойствами экземпляра класса SCTextFile являются следующие свойства:
@property (nonatomic, retain, readonly, getter=path) NSString *path;
@property (nonatomic, assign, readonly, getter=modified) BOOL modified;
- Свойство path возвращает путь к загруженному текстовому файлу. Изменение данного свойства происходит либо после завершения операции чтения текстового файла, либо после завершения операции записи текстового файла. Обращаем внимание, что данное свойство отличается от свойства name, содержащего имя текстового файла как экземпляра текстового класса.
- Класс SCTextFile наследует от классов SCStrings и SCText свойство modified. Однако только в классе SCTextFile данное свойство реализуется наиболее полно, поскольку в классах-предках оно применяется исключительно как индикатор наличия изменений в экземпляре класса.
В текстовых файлах свойство modified позволяет отслеживать внесение изменений в загруженные данные и на основании значения свойства принимать решение о необходимости сохранения внесенных изменений или их игнорирования. Методы записи текстовых файлов сбрасывают значение свойства в NO после успешного сохранения внесенных изменений. Методы сброса изменений также устанавливают значение данного свойства в NO. Подробнее о поведении свойства при проведении операций чтения и записи будет рассказано в соответствующих параграфах данной главы.
Создание текстовых файлов
Класс SCTextFile предоставляет ряд классовых методов для создания экземпляров класса на основании данных из последовательных файлов, словарей и потоков:
+ (instancetype)textFileWithCoder:(NSCoder *)coder;
+ (instancetype)textFileWithContentsOfSerializedFile:(NSString *)path;
+ (instancetype)textFileWithDataDictionary:(NSDictionary *)dictionary;
+ (instancetype)textFileWithDataDictionaryFromFile:(NSString *)path;
+ (instancetype)textFileWithStream:(
SCStream *)stream;
+ (instancetype)textFileWithFileStream:(NSString *)path;
Для создания экземпляров класса SCTextFile декларирует следующие классовые методы:
+ (instancetype)textFileWithName:(NSString *)name;
+ (instancetype)textFileWithString:(NSString *)string;
+ (instancetype)textFileWithStrings:(
SCStrings *)strings;
+ (instancetype)textFileWithCollection:(
id<
SCCollection>)collection;
+ (instancetype)textFileWithText:(
SCText *)text;
+ (instancetype)textFileWithTextFile:(
SCTextFile *)textFile;
+ (instancetype)textFileWithName:(NSString *)name stream:(
SCStream *)stream;
+ (instancetype)textFileFromStream:(
SCStream *)stream;
+ (instancetype)textFileWithName:(NSString *)name path:(NSString *)path;
+ (instancetype)textFileWithPath:(NSString *)path;
+ (instancetype)textFile;
- Классовый метод textFileWithName: создает пустой текстовый файл с заданным именем без привязки к конкретному файлу.
- Классовый метод textFileWithString: возвращает созданный неименованный текстовый файл без привязки к конкретному файлу с указанной строкой в качестве содержимого.
- Классовый метод textFileWithStrings: создает текстовый файл без привязки к конкретному файлу на основании данных из указанного существующего списка строк.
- Классовый метод textFileWithCollection: возвращает созданный текстовый файл без привязки к конкретному файлу на основании строк из заданной коллекции любого поддерживаемого библиотекой типа.
- Классовый метод textFileWithText: создает не привязанный к конкретному файлу экземпляр класса на основе данных из заданного существующего текста.
- Классовый метод textFileWithTextFile: возвращает созданную копию указанного текстового файла:
2016-08-30 10:54:27.015 libtest[2178:260503] Text file "paths" with path /etc/paths, strings=5, case sensitive: (
/usr/local/bin
/usr/bin
/bin
/usr/sbin
/sbin
)
- Классовый метод textFileWithName:stream: создает текстовый файл с заданным именем и загружает в него строки из указанного потока:
2016-08-30 10:57:33.962 libtest[2205:262097] Text file "networks" with path /etc/networks, strings=4, case sensitive: (
##
# Networks Database
##
loopback 127 loopback-net
)
- Классовый метод textFileFromStream: загружает текстовый файл из заданного открытого потока:
2016-08-30 11:12:08.944 libtest[2255:268444] Text file with path /etc/networks, strings=4, case sensitive: (
##
# Networks Database
##
loopback 127 loopback-net
)
- Классовый метод textFileWithName:path: создает текстовый файл с указанным именем и загружает в него строки из файла с заданным путем:
2016-08-30 11:14:58.937 libtest[2279:269946] Text file "paths" with path /etc/paths, strings=5, case sensitive: (
/usr/local/bin
/usr/bin
/bin
/usr/sbin
/sbin
)
- Классовый метод textFileWithPath: возвращает текстовый файл, загруженный из файла с указанным путем:
2016-08-30 11:17:55.231 libtest[2301:271717] Text file with path /etc/paths, strings=5, case sensitive: (
/usr/local/bin
/usr/bin
/bin
/usr/sbin
/sbin
)
- Классовый метод textFile создает пустой неименованный текстовый файл, не привязанный к конкретному файлу.
Инициализация текстовых файлов
Класс SCTextFile дополняет классы-предки следующими методами инициализации экземпляров класса:
- (instancetype)initWithTextFile:(
SCTextFile *)textFile;
- (instancetype)initWithName:(NSString *)name stream:(
SCStream *)stream;
- (instancetype)initFromStream:(
SCStream *)stream;
- (instancetype)initWithName:(NSString *)name path:(NSString *)path;
- (instancetype)initWithPath:(NSString *)path;
- Метод initWithName:stream: выполняет инициализацию экземпляра класса с заданным именем и строками из указанного открытого потока.
- Метод initFromStream: возвращает инициализированный экземпляр класса со строками из указанного открытого потока.
- Метод initWithName:path: инициализирует текстовый файл с заданными именем и строками из указанного файла.
- Метод initWithPath: осуществляет инициализацию текстового файла со строками из заданного файла.
Копирование текстовых файлов
Копирование текстовых файлов осуществляется следующими методами класса SCTextFile:
- Метод setTextFile: удаляет содержимое и настройки текущего текстового файла и копирует в него настройки и строки из указанного существующего текстового файла.
Преобразование текстовых файлов
Класс SCTextFile объявляет следующие методы преобразования текстовых файлов в экземпляры других классов:
- Свойство strings возвращает список строк, содержащий все строки из исходного текстового файла.
- Свойство uniqueStrings создает список уникальных строк на основе строк исходного текстового файла. Повторные строки игнорируются.
- Метод и свойство text преобразуют исходный текстовый файл в текст.
Чтение и запись текстовых файлов
Класс SCTextFile декларирует следующие методы для чтения текстовых файлов:
- (BOOL)readFromStream:(
SCStream *)stream;
- (BOOL)readWithPath:(NSString *)path;
- (BOOL)read;
- (BOOL)reset;
Все методы возвращают значение YES при успешном выполнении операции чтения и NO при возникновении какой-либо ошибки.
- Метод readFromStream: стирает текущее содержимое текстового файла и загружает строки из указанного в качестве аргумента метода потока. В ходе работы метода вызываются методы text:willReadFromStream: и text:didFinishReadingFromStream: объекта делегирования. После успешного завершения операции значение свойства modified устанавливается в NO.
2016-08-30 14:43:39.760 libtest[3433:395093] Text file with path /etc/paths, strings=5, case sensitive: (
/usr/local/bin
/usr/bin
/bin
/usr/sbin
/sbin
)
При работе данного метода могут возникать следующие ошибки:
- SCL-20062 - некорректный входной поток (поток не существует или не поддерживает операции чтения)
- SCL-20063 - исходный текстовый файл находится в режиме "только для чтения"
- SCL-20065 - поток не открыт
- SCL-20067 - ошибка чтения данных из потока
- Метод readWithPath: удаляет текущее содержимое текстового файла и считывает данные из файла с указанным в качестве аргумента метода путем. Во время работы метода вызываются методы объекта делегирования text:willReadWithPath: и text:didFinishReadingWithPath:. При успешном завершении операции свойство modified устанавливается в значение NO.
2016-08-30 14:47:04.004 libtest[3455:397299] Text file with path /etc/networks, strings=4, case sensitive: (
##
# Networks Database
##
loopback 127 loopback-net
)
Метод может генерировать следующие исключительные ситуации:
- SCL-20063 - исходный текстовый файл находится в режиме "только для чтения"
- SCL-20068 - методу передан нулевой указатель на путь к файлу
- SCL-20067 - ошибка чтения данных из файла
- Метод read выполняет загрузку данных из файла с ранее установленным другими методами экземпляра класса путем.
- Метод reset удаляет все сделанные с момента последней операции чтения или записи текстового файла изменения и заново загружает загружает содержимое файла. После успешного завершения операции свойству modified присваивается значение NO. При работе данного метода вызываются такие методы объекта делегирования, как willResetText: и didFinishResettingText:
NSLog( @"%@", textFile);
[textFile
addString:@"## Advanced Settings"];
NSLog( @"%@", textFile);
NSLog( @"%@", textFile);
2016-08-30 14:55:15.946 libtest[3489:402189] Text file with path /etc/networks, strings=4, case sensitive: (
##
# Networks Database
##
loopback 127 loopback-net
)
2016-08-30 14:55:15.946 libtest[3489:402189] Text file with path /etc/networks, strings=5, case sensitive, modified: (
##
# Networks Database
##
loopback 127 loopback-net
## Advanced Settings
)
2016-08-30 14:55:15.946 libtest[3489:402189] Text file with path /etc/networks, strings=4, case sensitive: (
##
# Networks Database
##
loopback 127 loopback-net
)
Запись данных в файлы осуществляется следующими методами класса SCTextFile:
- (BOOL)writeTextToStream:(
SCStream *)stream;
- (BOOL)writeWithPath:(NSString *)path;
- (BOOL)write;
- (BOOL)appendToFileWithPath:(NSString *)path;
- Метод writeTextToStream: осуществляет запись текстового файла в указанный поток. Во время работы метода вызываются методы text:willWriteToStream: и text:didFinishWritingToStream: объекта делегирования. После завершения операции свойство modified экземпляра класса принимает значение NO.
NSLog( @"Writing to stream: %d", [textFile writeTextToStream:stream]);
2016-08-30 15:01:52.872 libtest[3560:405779] Writing to stream: 1
В результате выполнения данного примера в файл /tmp/text.txt будут записаны следующие строки: String 00
String 01
String 02
При работе метода могут возникнуть следующие ошибки:
- SCL-20065 - поток не открыт
- SCL-20071 - поток не существует или не поддерживает операции записи
- SCL-20077 - ошибка во время выполнения операции записи
- Метод writeWithPath: производит запись содержимого экземпляра класса в файл с указанным путем. Если файл уже существует, то его предыдущее содержимое удаляется, в противном случае файл создается. Объект делегирования при этом вызывает методы text:willWriteWithPath: и text:didFinishWritingWithPath:. В случае успешной записи данных свойству modified присваивается значение NO.
NSLog( @"Writing to file: %d", [textFile writeWithPath:@"/tmp/strings.txt"]);
2016-08-30 15:16:32.425 libtest[3661:411369] Writing to file: 1
После завершения примера файл /tmp/strings.txt будет содержать следующие строки: String 10
String 20
String 30
Метод может генерировать следующие исключительные ситуации:
- SCL-20068 - указан нулевой путь к файлу
- SCL-20077 - ошибка во время выполнения операции записи
- Метод write осуществляет перезапись текущего содержимого текстового файла в ранее установленный путь к файлу и установку значения свойства modified равным NO. Перед выполнением примера файл /tmp/strings.txt хранит следующие строки:
String 10
String 20
String 30
NSLog( @"Writing to file: %d", [textFile write]);
2016-08-30 15:19:40.110 libtest[3689:413340] Writing to file: 1
После завершения работы данного примера содержимое файла /tmp/strings.txt заменяется на следующие строки: String 10
String 20
String 30
String 40
- Метод appendToFileWithPath: добавляет содержимое текстового файла в конец файла с указанным к нему путем. Если файл не существует, он создается. Содержимое файла перед выполнением примера:
String 00
String 01
String 02
NSLog( @"Appending to file: %d", [textFile appendToFileWithPath:@"/tmp/text.txt"]);
2016-08-30 15:26:01.108 libtest[3739:416977] Appending to file: 1
После завершения работы примера содержимое файла изменяется следующим образом: String 00
String 01
String 02
=========
Committed
Чтение и запись текстовых блоков
Для осуществления загрузки текстовых блоков класс SCTextFile декларирует следующие методы:
- (BOOL)addTextFromStream:(
SCStream *)stream;
- (BOOL)addTextWithPath:(NSString *)path;
- (BOOL)insertTextWithPath:(NSString *)path atIndex:(
SCIndex)index;
При рассмотрении данных методов мы будем использовать созданный нами текстовый файл /tmp/sample.txt:
- Метод addTextFromStream: добавляет в конец текстового файла строки из указанного потока:
NSLog( @"%@", textFile);
NSLog( @"%@", textFile);
2016-09-05 13:41:14.239 libtest[2357:257266] Text file without path, strings=2, case sensitive, modified: (
String 00
String 01
)
2016-09-05 13:41:14.240 libtest[2357:257266] Text file without path, strings=4, case sensitive, modified: (
String 00
String 01
String 10
String 11
)
- Метод addTextWithPath: загружает текст из указанного файла и добавляет его в конец текстового файла:
NSLog( @"%@", textFile);
NSLog( @"%@", textFile);
2016-09-05 13:43:54.061 libtest[2393:259125] Text file without path, strings=2, case sensitive, modified: (
String 20
String 21
)
2016-09-05 13:43:54.061 libtest[2393:259125] Text file without path, strings=4, case sensitive, modified: (
String 20
String 21
String 10
String 11
)
- Метод insertTextFromStream:atIndex: загружает текст из указанного потока и вставляет его в заданную индексом позицию:
NSLog( @"%@", textFile);
NSLog( @"%@", textFile);
2016-09-05 13:55:55.000 libtest[2450:266126] Text file without path, strings=2, case sensitive, modified: (
String 00
String 01
)
2016-09-05 13:55:55.001 libtest[2450:266126] Text file without path, strings=4, case sensitive, modified: (
String 00
String 10
String 11
String 01
)
- Метод insertTextWithPath:atIndex: выполняет загрузку текста из файла с заданным путем и вставку загруженного текста по указанному индексу:
NSLog( @"%@", textFile);
NSLog( @"%@", textFile);
2016-09-05 14:46:44.553 libtest[2542:293686] Text file without path, strings=2, case sensitive, modified: (
String 20
String 21
)
2016-09-05 14:46:44.554 libtest[2542:293686] Text file without path, strings=4, case sensitive, modified: (
String 10
String 11
String 20
String 21
)
Замену текстовых блоков на строки из файлов обеспечивают следующие методы класса SCTextFile:
- (BOOL)replaceTextInRange:(NSRange)range withTextFromStream:(
SCStream *)stream;
- (BOOL)replaceTextInRange:(NSRange)range withTextWithPath:(NSString *)path;
- (BOOL)replaceText:(
SCStrings *)text withTextWithPath:(NSString *)path;
- Метод replaceTextInRange:withTextFromStream: заменяет текст в заданном диапазоне на строки из указанного открытого потока:
NSLog( @"%@", textFile);
NSLog( @"%@", textFile);
2016-09-06 10:54:41.543 libtest[2786:375288] Text file without path, strings=4, case sensitive, modified: (
String 01
String 02
String 03
String 04
)
2016-09-06 10:54:41.544 libtest[2786:375288] Text file without path, strings=4, case sensitive, modified: (
String 01
String 10
String 11
String 04
)
- Метод replaceTextInRange:withTextWithPath: выполняет замену текста в указанном диапазоне на строки из файла с заданным к нему путем:
NSLog( @"%@", textFile);
NSLog( @"%@", textFile);
2016-09-06 11:05:17.113 libtest[2835:379332] Text file without path, strings=4, case sensitive, modified: (
String 21
String 22
String 23
String 24
)
2016-09-06 11:05:17.114 libtest[2835:379332] Text file without path, strings=4, case sensitive, modified: (
String 21
String 10
String 11
String 24
)
- Метод replaceText:withTextFromStream: заменяет все вхождения указанного текста на строки, загружаемые из заданного потока:
NSLog( @"%@", textFile);
NSLog( @"%@", textFile);
2016-09-06 11:40:46.735 libtest[2915:393195] Text file without path, strings=4, case sensitive, modified: (
String 01
String 02
String 03
String 04
)
2016-09-06 11:40:46.736 libtest[2915:393195] Text file without path, strings=4, case sensitive, modified: (
String 10
String 11
String 03
String 04
)
- Метод replaceText:withTextWithPath: осуществляет замену всех вхождений указанного текстового блока на строки, считанные из файла с заданным путем к нему:
NSLog( @"%@", textFile);
NSLog( @"%@", textFile);
2016-09-06 11:48:05.730 libtest[2943:396110] Text file without path, strings=4, case sensitive, modified: (
String 01
String 02
String 03
String 04
)
2016-09-06 11:48:05.732 libtest[2943:396110] Text file without path, strings=4, case sensitive, modified: (
String 01
String 02
String 10
String 11
)
Запись текстовых блоков в классе SCTextFile обеспечивают следующие методы:
- (BOOL)writeTextInRange:(NSRange)range toStream:(
SCStream *)stream;
- (BOOL)writeTextInRange:(NSRange)range withPath:(NSString *)path;
- (BOOL)appendTextInRange:(NSRange)range toFileWithPath:(NSString *)path;
- (
SCText *)cutTextInRange:(NSRange)range toStream:(
SCStream *)stream;
- (
SCText *)cutTextInRange:(NSRange)range withPath:(NSString *)path;
- (
SCText *)cutAndAppendTextInRange:(NSRange)range toFileWithPath:(NSString *)path;
- Метод writeTextInRange:toStream: записывает строки в указанном диапазоне в заданный поток. При успешном завершении операции метод возвращает значение YES, возврат значения NO свидетельствует о возникновении какой-либо ошибки.
- Метод writeTextInRange:withPath: сохраняет строки в указанном диапазоне в файле с заданным путем к нему. Если указанный файл существует, то его содержимое удаляется. Значение YES сообщает программисту об успешном выполнении операции, а значение NO - о возникновении ошибки.
- Метод appendTextInRange:toFileWithPath: возвращает значение YES при успешном добавлении строк в указанном диапазоне в файл с заданным путем. Если файл не существует, он создается. При возникновении ошибки метод возвращает значение NO. Содержимое выходного файла до выполнения операции:
=================
String 10
String 12
- Метод cutTextInRange:toStream: сохраняет текст в заданном диапазоне в указанном потоке, при этом сам текст удаляется и возвращается в виде значения метода:
NSLog( @"%@", textFile);
NSLog( @"%@", text);
NSLog( @"%@", textFile);
2016-09-06 14:18:26.778 libtest[3363:448620] Text file without path, strings=4, case sensitive, modified: (
String 01
String 02
String 03
String 04
)
2016-09-06 14:18:26.778 libtest[3363:448620] Text count=2, case sensitive, modified: (
String 01
String 02
)
2016-09-06 14:18:26.779 libtest[3363:448620] Text file without path, strings=2, case sensitive, modified: (
String 03
String 04
)
- Метод cutTextInRange:withPath: записывает текст в указанном диапазоне строк в файл с заданным путем (с удалением старого содержимого файла при его наличии), удаляет сохраненные строки и возвращает удаленный текст как значением метода:
NSLog( @"%@", textFile);
NSLog( @"%@", text);
NSLog( @"%@", textFile);
2016-09-06 14:22:08.930 libtest[3401:451083] Text file without path, strings=4, case sensitive, modified: (
String 11
String 22
String 33
String 44
)
2016-09-06 14:22:08.931 libtest[3401:451083] Text count=2, case sensitive, modified: (
String 22
String 33
)
2016-09-06 14:22:08.931 libtest[3401:451083] Text file without path, strings=2, case sensitive, modified: (
String 11
String 44
)
- Метод cutAndAppendTextInRange:toFileWithPath: добавляет в указанный файл строки в заданном диапазоне, удаляя их при этом из исходного текстового файла, а также возвращая удаленные строки как значение метода:
NSLog( @"%@", textFile);
NSLog( @"%@", text);
NSLog( @"%@", textFile);
2016-09-06 14:30:32.322 libtest[3468:456547] Text file without path, strings=4, case sensitive, modified: (
String 00
String 10
String 20
String 30
)
2016-09-06 14:30:32.323 libtest[3468:456547] Text count=2, case sensitive, modified: (
String 20
String 30
)
2016-09-06 14:30:32.323 libtest[3468:456547] Text file without path, strings=2, case sensitive, modified: (
String 00
String 10
)
#########
String 20
String 30
Кроме вышеперечисленных методов класс SCTextFile объявляет методы, которые записывают в файлы строки, отобранные по определенным критериям:
- (BOOL)writeTextWithSubstring:(NSString *)substring toStream:(
SCStream *)stream;
- (BOOL)writeTextWithSubstring:(NSString *)substring withPath:(NSString *)path;
- (BOOL)writeTextWithoutSubstring:(NSString *)substring toStream:(
SCStream *)stream;
- (BOOL)writeTextWithoutSubstring:(NSString *)substring withPath:(NSString *)path;
- Метод writeTextWithSubstring:toStream: сохраняет в указанный поток строки, которые содержат заданную в качестве параметра метода подстроку:
- Метод writeTextWithSubstring:withPath: отбирает строки, содержащие заданную подстроку и записывает их в файл с указанным путем к нему:
- Метод writeTextWithoutSubstring:toStream: записывает в заданный поток строки, которые не содержат указанной подстроки:
- Метод writeTextWithoutSubstring:withPath: сохраняет в указанном файле строки, не содержащие заданной подстроки:
Обработка ошибок
Механизм текстов библиотеки включает в себя средства обработки ошибок, которые могут возникать при работе с экземплярами класса SCStrings и его потомков. Поддержка данных средств основана на классе исключительной ситуации SCTextException.
В данной главе руководства мы рассмотрим алгоритм обработки ошибок текстовыми классами, а также приведем описание ошибок, которые могут возникнуть при использовании соответствующих классов.
Алгоритм обработки ошибок
Основной алгоритм обаботки обнаруженных ошибок реализован в классе SCStrings. Его потомки применяют данный алгоритм для обработки собственных ошибок (ошибок, характерных только для данного дочернего класса).
При обнаружении ошибок экземпляр класса SCStrings поступает следующим образом:
- Если экземпляру класса назначен объект делегирования, то выполняется вызов его метода text:didDetectException:, которому передаются указатель на обнаруживший ошибку экземпляр класса и указатель на данные об ошибке в виде экземпляра класса исключительной ситуации SCTextException.
- Если метод объекта делегирования возвращает значение YES, экземпляр класса игнорирует данную ошибку с остановкой работы метода, во время выполнения которого была зафиксирована ошибочная ситуация.
- В том случае, если метод объекта делегирования возвращает значение NO или объект делегирования не был назначен, осуществляется генерация исключительной ситуации SCTextException, благодаря чему функция обработки данной ошибки передается на более высокий уровень программного кода.
Ошибки списков строк
При работе с экземплярами класса SCStrings, а также с экземплярами классов-потомков могут возникать следующие исключительные ситуации:
- Исключительная ситуация SCL-20061 генерируется в том случае, если какому-либо методу передан нулевой указатель на исходный объект, например методу инициализации списка строк в виде копии существующего списка строк.
- При попытке внесения любых изменений в содержимое списка строк, находящегося в режиме только для чтения (свойство readOnly установлено в значение YES) генерируется исключительная ситуация SCL-20063.
- Ошибка SCL-20064 возникает при попытке добавить или вставить в список строк нулевой указатель на строку.
- При работе с коллекциями список строк может обнаружить в них экземпляры классов, которые не являются строками. В этом случае генерируется исключительная ситуация SCL-20066. Выяснить имя класса, к которому относится вызвавший ошибку экземпляр, можно через свойство unsupported экземпляра класса исключительной ситуации SCTextException. На данный момент эту ошибку вызывают экземпляры любых классов, отличных от NSString. Мы рассматриваем также возможность автоматического преобразования числовых объектов класса NSNumber в текстовое представление, однако пока данный вопрос остается открытым.
- Исключительная ситуация SCL-20070 возникает при попытке вызвать сортировку с некорректным сортировщиком строк (например, когда передан нулевой указатель на сортировщик или указатель указывает на экземпляр класса, который не поддерживает протокол SCSorter).
- При обращении к строке с несуществующим индексом генерируется исключительная ситуация SCL-20072. Узнать некорректный индекс можно через свойство index экземпляра класса исключительной ситуации SCTextException.
- Если экземпляру класса SCStrings передается некорректное множество индексов строк, происходит генерация ошибки SCL-20074 с передачей ошибочного множества индексов через свойство indexSet экземпляра класса исключительной ситуации SCTextException.
- Исключительная ситуация SCL-20075 генерируется методами, которые в качестве аргументов воспринимают множество индексов и список (или коллекцию). Свойства indexesCount и stringsCount экземпляра класса исключительной ситуации SCTextException позволяют определить количество индексов и строк.
Ошибки списков уникальных строк
Класс SCUniqueStrings дополняет родительский класс SCStrings следующими исключительными ситуациями:
- Исключительная ситуация SCL-20069 генерируется в том случае, если список уникальных строк обнаруживает дублирование строки и при работе экземпляра класса в строгом режиме (свойство strongMode установлено в значение YES).
Ошибки текстов
Класс SCText также дополняет унаследованные исключительные ситуации собственными, связанными с функциональностью самого класса:
- Исключительная ситуация SCL-20073 возникает при передаче ряду методов экземпляра класса SCText некорректного диапазона строк (тип NSRange). Выяснить ошибочный диапазон можно через свойство range экземпляра класса исключительной ситуации SCTextException.
- Методы перемещения и копирования текстовых блоков могут генерировать исключительную ситуацию SCL-20076 при обнаружении пересечения диапазонов обрабатываемых строк, например, при попытке указать в качестве аргументов метода обмена текстовыми блоками. Экземпляр класса исключительной ситуации SCTextException предоставляет доступ к таким диапазонам через свойства range и intersected.
Ошибки текстовых файлов
Как и другие потомки класса SCStrings, класс SCTextFile добавляет свои собственные исключительные ситуации, связанные с различными ошибками при выполнении операций ввода-вывода. Обращаем внимание, что в ряде случаев (в зависимости от режимов работы используемых потоков) вместо генерации исключительной ситуации SCTextException возможна генерация исключительных ситуаций SCStreamException, SCFileStreamException и SCSystemException.
- Исключительные ситуации SCL-20062 и SCL-20071 генерируются если экземпляр класса SCTextFile обнаруживает, что переданный ему для работы поток не поддерживает необходимые операции. Например, если методу чтения строк из потока был передан указатель на поток, открытый только для записи и наоборот. Свойство stream экземпляра класса исключительной ситуации SCTextException содержит указатель на ошибочный поток.
- Если экземпляру класса SCTextFile был передан указатель на закрытый поток, то при попытке чтения или записи данных генерируется исключительная ситуация SCL-20065.
- При попытке передать методам экземпляра класса SCTextFile в качестве пути к файлу пустого указателя или пустой строки генерируется исключительная ситуация SCL-20068.
Протокол делегирования SCTextDelegate
Протокол делегирования SCTextDelegate декларирует методы, которые можно разделить на ряд функциональных групп:
- метод обработки строк
- метод обработки ошибок
- методы событий добавления строк
- методы событий удаления строк
- методы событий сортировки строк
- методы событий замены строк
- методы событий копирования и перемещения строк
- методы событий чтения и записи текстовых файлов и блоков
Подробные описания данных методов приводятся в описании протокола и в соответствующих разделах данного руководства.
Текстовые индексы
Текстовый индекс - экземпляр класса SCTextIndex, который содержит в себе данные о позиции внутри текста, состоящие из номера (индекса) строки и номера (индекса) символа в строке. Является вспомогательным классом для текстовых классов и самостоятельно не используется.
Для доступа к хранящимся в экземпляре класса индексам объявлены следующие свойства и методы:
@property (nonatomic, assign, getter=line, setter=setLine:)
SCULong line;
@property (nonatomic, assign, getter=character, setter=setCharacter:)
SCULong character;
- (void)setCharacter:(
SCULong)character;
Создание экземпляров класса SCTextIndex выполняется с помощью классовых методов, а также специальной функции:
+ (instancetype)textIndexWithLine:(
SCULong)line character:(
SCULong)character;
+ (instancetype)textIndexWithTextIndex:(
SCTextIndex *)textIndex;
+ (instancetype)textIndex;
Расширения класса NSString
Стандартный класс NSString обеспечивает программистов большим кругом функциональных возможностей. Тем не менее, всегда находятся те или иные нужды и предложения, которыми хочется дополнить базовую функциональность данного стандартного класса.
Благодаря возможностям языке Objective-C это можно сделать без необходимости создавать дочерние классы, что потребовало бы в программном коде использовать экземпляры этих дочерних классов. Благодаря категориям мы можем расширить функциональность существующего класса и вызывать новые возможности при использовании экземпляров самого класса, а не его потомков.
Данный раздел руководства программирования описывает расширения, обеспечиваемые категорией NSString(SCString), в том числе и добавление поддержки стандартных возможностей нашей библиотеки (потоки, словари, коллекции и так далее). Рассматривать добавленные нами возможности мы будем с учетом их группировки по следующим группам:
Создание строк
Для создания строк из последовательных файлов, словарей и потоков используются следующие методы категории NSString(SCString):
+ (instancetype)stringWithCoder:(NSCoder *)coder;
+ (instancetype)stringWithContentsOfSerializedFile:(NSString *)path;
+ (instancetype)stringWithDataDictionary:(NSDictionary *)dictionary;
+ (instancetype)stringWithDataDictionaryFromFile:(NSString *)path;
+ (instancetype)stringWithStream:(
SCStream *)stream;
+ (instancetype)stringWithFileStream:(NSString *)path;
Категория NSString(SCString) дополняет класс NSString следующими классовыми методами создания текстовых строк:
+ (instancetype)stringWithIndexSet:(NSIndexSet *)indexSet;
+ (instancetype)stringWithCharacter:(unichar)character;
+ (instancetype)stringWithCharacter:(unichar)character length:(
SCIndex)length;
+ (instancetype)stringWithLength:(
SCUInteger)length;
+ (instancetype)stringWithPointer:(void *)pointer;
+ (instancetype)stringWithID:(id)object;
- Классовый метод stringWithIndexSet: создает строку в виде текстового представления множества индексов (экземпляр класса NSIndexSet):
NSMutableIndexSet *indexSet = [NSMutableIndexSet indexSet];
[indexSet addIndex:2];
[indexSet addIndex:4];
[indexSet addIndex:8];
NSString *string = [NSString stringWithIndexSet:indexSet];
NSLog( @"%@", string);
2016-09-07 15:12:38.546 libtest[2562:194688] (2, 4, 8)
- Классовый метод stringWithCharacter: возвращает созданную на основе указанного символа строку:
NSString *string = [NSString stringWithCharacter:'D'];
NSLog( @"%@", string);
2016-09-07 15:31:27.264 libtest[2633:207778] D
- Классовый метод stringWithCharacter:length: возвращает строку из указанного количества заданных символов:
NSString *string = [NSString stringWithCharacter:'#' length:8];
NSLog( @"%@", string);
2016-09-07 15:35:48.226 libtest[2655:211738] ########
- Классовый метод stringWithLength: создает строку пробелов заданной длины:
NSString *string = [NSString stringWithLength:12];
NSLog( @"#%@#", string);
2016-09-07 15:47:12.583 libtest[2680:217096] # #
- Классовый метод stringWithPointer: возвращает строку, содержащую текстовое представление адреса в памяти, на который указывает переданный в качестве аргумента метода указатель:
size_t size = 64;
void *pointer = malloc(size);
NSString *string = [NSString stringWithPointer:pointer];
NSLog( @"%@", string);
free(pointer);
2016-09-07 15:52:36.835 libtest[2713:220992] 0x100703890
- Классовый метод stringWithID: создает строку в виде текстового представления указанного экземпляра класса:
NSString *string = [NSString stringWithID:object];
NSLog( @"%@", string);
2016-09-07 15:58:15.378 libtest[2747:224739] (23, 19)
Инициализация строк
Кроме классовых методов создания экземпляров класса NSString категория NSString(SCString) декларирует дополнительные методы инициализации строк:
- (instancetype)initWithIndexSet:(NSIndexSet *)indexSet;
- (instancetype)initWithCharacter:(unichar)character;
- (instancetype)initWithCharacter:(unichar)character length:(
SCIndex)length;
- (instancetype)initWithLength:(
SCUInteger)length;
- (instancetype)initWithPointer:(void *)pointer;
- (instancetype)initWithID:(id)object;
- Метод initWithIndexSet: выполняет инициализацию строки с использованием указанного множества индексов.
- Метод initWithCharacter: осуществляет инициализацию строки из указанного символа.
- Метод initWithCharacter:length: возвращает инициализированную строку из указанного количества заданных символов.
- Метод initWithLength: инициализирует строку из указанного количества пробелов.
- Метод initWithPointer: возвращает инициализированную строку с текстовым представлением адреса в памяти, на который указывает заданный в качестве аргумента метода указатель.
- Метод initWithID: осуществляет инициализацию строки с использованием текстового представления заданного экземпляра любого класса.
Разделение и замена строк и подстрок
Категория NSString(SCString) дополняет стандартный класс NSString большим диапазоном методов разделения строк на части и замены строк и подстрок. Для удобства описания методов глава разделяется на ряд параграфов в соответствии с назначением методов.
Отбрасывание частей строк
- (NSString *)ltrim;
- (NSString *)rtrim;
- (NSString *)trim;
- (NSString *)stringWithLeftCharacters:(
SCIndex)characters;
- (NSString *)stringWithRightCharacters:(
SCIndex)characters;
- (NSString *)skipLeftPart:(
SCIndex)characters;
- (NSString *)skipRightPart:(
SCIndex)characters;
- Методы ltrim, rtrim и trim возвращают строку без ведущих, замыкающих или ведущих и замыкающих пробелов и знаков табуляции:
NSString *string = @" Test string ";
NSLog( @"#%@#", [string ltrim]);
NSLog( @"#%@#", [string rtrim]);
NSLog( @"#%@#", [string trim]);
2016-09-08 09:45:56.083 libtest[1063:17768] #Test string #
2016-09-08 09:45:56.083 libtest[1063:17768] # Test string#
2016-09-08 09:45:56.083 libtest[1063:17768] #Test string#
- Методы stringWithLeftCharacters: и stringWithRightCharacters: возвращают строку, которая содержит указанное количество ведущих или замыкающих символов исходной строки. Если в исходной строке меньше символов, чем передано в аргументе методов, возвращается исходная строка.
NSString *string = @"0123456789";
NSLog( @"%@", [string stringWithLeftCharacters:4]);
NSLog( @"%@", [string stringWithRightCharacters:4]);
2016-09-08 09:54:41.037 libtest[1099:19897] 0123
2016-09-08 09:54:41.038 libtest[1099:19897] 6789
- Методы skipLeftPart: и skipRightPart: возвращают строку без указанного количества ведущих или замыкающих символов. Если в исходной строке меньше символов, чем указано в аргументе методов, возвращается пустая строка.
NSString *string = @"0123456789";
NSLog( @"%@", [string skipLeftPart:4]);
NSLog( @"%@", [string skipRightPart:4]);
2016-09-08 09:58:10.444 libtest[1123:21873] 456789
2016-09-08 09:58:10.445 libtest[1123:21873] 012345
Поиск подстрок
- (BOOL)isCorrectRange:(NSRange)range;
- (BOOL)existsSubstring:(NSString *)substring caseInsensitive:(BOOL)caseInsensitive;
- (BOOL)existsSubstring:(NSString *)substring;
- (
SCIndex)countOfSubstring:(NSString *)substring caseInsensitive:(BOOL)caseInsensitive;
- (
SCIndex)countOfSubstring:(NSString *)substring;
- (
SCIndex)indexOfSubstring:(NSString *)substring caseInsensitive:(BOOL)caseInsensitive;
- (
SCIndex)indexOfSubstring:(NSString *)substring;
- (
SCArray *)indexesOfSubstring:(NSString *)substring caseInsensitive:(BOOL)caseInsensitive;
- (
SCArray *)indexesOfSubstring:(NSString *)substring;
- Метод isCorrectRange: определяет корректность указанного диапазона символов по отношению к исходной строке. Если переданный диапазон явлется корректным, метод возвращает значение YES, в противном случае возвращается значение NO.
NSString *string = @"0123456789";
NSLog( @"%d", [string isCorrectRange:NSMakeRange(6, 2)]);
NSLog( @"%d", [string isCorrectRange:NSMakeRange(8, 4)]);
2016-09-08 10:27:12.437 libtest[1304:38314] 1
2016-09-08 10:27:12.438 libtest[1304:38314] 0
- Методы existsSubstring:caseInsensitive: и existsSubstring: проверяют наличие в строке указанной подстроки. При использовании первого метода возможно управление регистрозависимостью поиска подстроки, второй метод всегда осуществляет регистронезависимый поиск. Если искомая подстрока найдена, возвращается значение YES, в противном случае методы возвращают значение NO.
NSString *string = @"Sample string";
NSLog( @"%d", [string existsSubstring:@"sample"]);
NSLog( @"%d", [string existsSubstring:@"sample" caseInsensitive:YES]);
2016-09-08 10:30:33.017 libtest[1330:39892] 0
2016-09-08 10:30:33.017 libtest[1330:39892] 1
- Методы countOfSubstring:caseInsensitive: и countOfSubstring: возвращают количество вхождений указанной подстроки в исходную строку:
NSString *string = @"Sample string (from sample set)";
NSLog( @"%d", [string countOfSubstring:@"message"]);
NSLog( @"%d", [string countOfSubstring:@"sample"]);
NSLog( @"%d", [string countOfSubstring:@"sample" caseInsensitive:YES]);
2016-09-08 10:33:28.368 libtest[1362:41835] 0
2016-09-08 10:33:28.368 libtest[1362:41835] 1
2016-09-08 10:33:28.369 libtest[1362:41835] 2
- Методы indexOfSubstring:caseInsensitive: и indexOfSubstring: возвращают индекс первого вхождения указанной подстроки в исходную строку. Если искомая подстрока не найдена, методы возвращают значение NSNotFound.
NSString *string = @"Sample string (from sample set)";
NSLog( @"%d", [string indexOfSubstring:@"message"]);
NSLog( @"%d", [string indexOfSubstring:@"sample"]);
NSLog( @"%d", [string indexOfSubstring:@"sample" caseInsensitive:YES]);
2016-09-08 10:41:41.499 libtest[1406:46169] -1
2016-09-08 10:41:41.499 libtest[1406:46169] 20
2016-09-08 10:41:41.499 libtest[1406:46169] 0
- Методы indexesOfSubstring:caseInsensitive: и indexesOfSubstring: возвращают массив индексов вхождений заданной подстроки в исходную строку.
NSString *string = @"Sample string (from sample set)";
NSLog( @"%@", [string indexesOfSubstring:@"message"]);
NSLog( @"%@", [string indexesOfSubstring:@"sample"]);
NSLog( @"%@", [string indexesOfSubstring:@"sample" caseInsensitive:YES]);
2016-09-08 10:45:02.004 libtest[1423:47803] Array count=0:
)
2016-09-08 10:45:02.004 libtest[1423:47803] Array count=1: (
"20"
)
2016-09-08 10:45:02.004 libtest[1423:47803] Array count=2: (
"0",
"20"
)
Удаление подстрок
- (NSString *)stringWithDeletedSubstring:(NSString *)substring caseInsensitive:(BOOL)caseInsensitive;
- (NSString *)stringWithDeletedSubstring:(NSString *)substring;
- (NSString *)stringWithDeletedSubstringToIndex:(
SCIndex)index;
- (NSString *)stringWithDeletedSubstringToRange:(NSRange)range;
- (NSString *)stringWithDeletedSubstringFromIndex:(
SCIndex)index;
- (NSString *)stringWithDeletedSubstringWithRange:(NSRange)range;
- Методы stringWithDeletedSubstring:caseInsensitive: и stringWithDeletedSubstring: удаляют из исходной строки все вхождения заданной подстроки. При вызове первого метода возможно управление режимом регистрозависимости при поиске удаляемой подстроки. Второй метод всегда выполняет регистронезависимый поиск. Если указанная подстрока не имеет ни одного вхождения в исходную строку, методы не выполняют никаких удалений.
NSString *string = @"Sample string (from sample set)";
NSLog( @"%@", [string stringWithDeletedSubstring:@"sample"]);
NSLog( @"%@", [string stringWithDeletedSubstring:@"sample" caseInsensitive:YES]);
2016-09-08 12:13:32.981 libtest[1757:91307] Sample string (from set)
2016-09-08 12:13:32.981 libtest[1757:91307] string (from set)
- Метод stringWithDeletedSubstringToIndex: возвращает строку из которой удалены все символы до указанного индекса:
NSString *string = @"0123456789";
NSLog( @"%@", [string stringWithDeletedSubstringToIndex:4]);
2016-09-08 12:16:04.777 libtest[1779:93021] 456789
- Метод stringWithDeletedSubstringToRange: возвращает строку без символов, входящих в указанный диапазон и без символов до указанного диапазона:
NSString *string = @"0123456789";
NSLog( @"%@", [string stringWithDeletedSubstringToRange:NSMakeRange(4,2)]);
2016-09-08 12:18:34.292 libtest[1808:94967] 6789
- Метод stringWithDeletedSubstringFromIndex: возвращает строку, из которой удалены все символы, начиная с указанного индекса:
NSString *string = @"0123456789";
NSLog( @"%@", [string stringWithDeletedSubstringFromIndex:4]);
2016-09-08 12:21:48.779 libtest[1833:97889] 0123
- Метод stringWithDeletedSubstringWithRange: возвращает строку без символов в указанном диапазоне:
NSString *string = @"0123456789";
NSLog( @"%@", [string stringWithDeletedSubstringWithRange:NSMakeRange(4,2)]);
2016-09-08 12:24:04.174 libtest[1852:99733] 01236789
Замена подстрок
- (NSString *)stringWithReplacedSubstringToIndex:(
SCUInteger)index withString:(NSString *)string;
- (NSString *)stringWithReplacedSubstringFromIndex:(
SCUInteger)index withString:(NSString *)string;
- (NSString *)stringWithReplacedSubstringWithRange:(NSRange)range withString:(NSString *)string;
- (NSString *)stringWithReplacedSubstring:(NSString *)substring
withString:(NSString *)string
caseInsensitive:(BOOL)caseInsensitive;
- (NSString *)stringWithReplacedSubstring:(NSString *)substring withString:(NSString *)string;
- Метод stringWithReplacedSubstringToIndex:withString: возвращает строку, в которой символы перед указанным индексом заменены на заданную подстроку:
NSString *string = @"0123456789";
NSLog( @"%@", [string stringWithReplacedSubstringToIndex:4 withString:@"ABCD_"]);
2016-09-08 12:57:19.581 libtest[2061:118066] ABCD_456789
- Метод stringWithReplacedSubstringFromIndex:withString: возвращает строку, у которой заданная подстрока заменяет символы начиная с указанного индекса:
NSString *string = @"0123456789";
NSLog( @"%@", [string stringWithReplacedSubstringFromIndex:6 withString:@"_SMND"]);
2016-09-08 12:59:44.898 libtest[2089:119513] 012345_SMND
- Метод stringWithReplacedSubstringWithRange:withString: заменяет в исходной строке символы в заданном диапазоне на указанную подстроку:
NSString *string = @"0123456789";
NSLog( @"%@", [string stringWithReplacedSubstringWithRange:NSMakeRange(4, 2) withString:@"_IETF_"]);
2016-09-08 13:07:10.944 libtest[2112:121668] 0123_IETF_6789
- Методы stringWithReplacedSubstring:withString:caseInsensitive: и stringWithReplacedSubstring:withString: выполняют замену в исходной строке всех вхождений одной подстроки на другую подстроку. При использовании первого метода возможно указание работы режима регистрозависимости. В случае применения второго метода поиск заменяемой подстроки выполняется с учетом регистра символов.
NSString *string = @"Sample string (from sample set)";
NSLog( @"%@", [string stringWithReplacedSubstring:@"sample" withString:@"test"]);
NSLog( @"%@", [string stringWithReplacedSubstring:@"sample" withString:@"test" caseInsensitive:YES]);
2016-09-08 13:11:02.478 libtest[2137:123402] Sample string (from test set)
2016-09-08 13:11:02.478 libtest[2137:123402] test string (from test set)
Вставка подстрок
- (NSString *)stringWithInsertedString:(NSString *)string;
- (NSString *)stringWithInsertedString:(NSString *)string index:(
SCUInteger)index;
- Метод stringWithInsertedString: возвращает исходную строку с добавленной в ее начало заданной строкой:
NSString *string = @"0123456789";
NSLog( @"%@", [string stringWithInsertedString:@"SMND_"]);
2016-09-08 14:09:00.147 libtest[2338:151105] SMND_0123456789
- Метод stringWithInsertedString:index: вставляет в указанную позицию исходной строки заданную строку:
NSString *string = @"0123456789";
NSLog( @"%@", [string stringWithInsertedString:@"_SMND_" index:5]);
2016-09-08 14:30:07.071 libtest[2432:161179] 01234_SMND_56789
Работа со словами в составе строк
Работа с отдельными словами текстовых строк осуществляется следующими методами категории NSString(SCString):
@property (nonatomic, retain, readonly, getter=normalizedString) NSString *normalizedString;
@property (nonatomic, assign, readonly, getter=wordsCount)
SCIndex wordsCount;
@property (nonatomic, retain, readonly, getter=firstWord) NSString *firstWord;
@property (nonatomic, retain, readonly, getter=lastWord) NSString *lastWord;
@property (nonatomic, retain, readonly, getter=endOfString) NSString *endOfString;
- (NSString *)normalizedString;
- (NSString *)firstWord;
- (NSString *)lastWord;
- (NSString *)endOfString;
- Свойство и метод normalizedString возвращают нормализованную исходную строку, то есть строку без ведущих и замыкающих пробелов и знаков табуляции, каждое слово в которой отделено от соседних одним пробелом:
NSString *string = @" This is a test message string ";
NSLog( @"%@", string.normalizedString);
2016-09-08 15:12:18.373 libtest[2577:181304] This is a test message string
- Метод и свойство wordsCount возвращают количество слов в исходной строке:
NSString *string = @"This is a test message string";
NSLog( @"%d", [string wordsCount]);
2016-09-08 15:15:46.804 libtest[2612:183537] 6
- Метод word: возвращает слово с указанным индексом. Если методу передан некорректный индекс слова, возвращается пустая строка.
NSString *string = @"This is a test message string";
NSLog( @"%@", [string word:3]);
NSLog( @"%@", [string word:5]);
2016-09-08 15:20:54.105 libtest[2640:185875] test
2016-09-08 15:20:54.105 libtest[2640:185875] string
- Метод и свойство firstWord возвращают первое слово исходной строки. Если в строке нет ни одного слова, метод возвращает пустую строку.
NSString *string = @"This is a test message string";
NSLog( @"%@", string.firstWord);
2016-09-08 15:23:22.066 libtest[2657:187834] This
- Свойство и метод lastWord возвращают последнее слово исходной строки. Если в строке нет ни одного слова, возвращается пустая строка.
NSString *string = @"This is a test message string";
NSLog( @"%@", [string lastWord]);
2016-09-08 15:25:34.884 libtest[2673:189714] string
- Метод и свойство endOfString возвращают исходную строку без первого слова:
NSString *string = @"This is a test message string";
NSLog( @"%@", string.endOfString);
2016-09-08 15:28:01.610 libtest[2707:193924] is a test message string
Сравнение строк
Существующие в классе NSString методы сравнения экземпляров класса дополняются следующими методами категории NSString(SCString):
- (BOOL)isEqualToStrings:(NSString *)string, ...;
- Метод isEqualToStrings: выполняет сравнение исходной строки с завершаемым нулевым указателем списком строк. Если исходная строка совпадает хотя бы с одной из строк списка, метод возвращает значение YES. В противном случае возвращается значение NO.
NSString *string = @"Test string";
NSLog( @"%d", [string isEqualToStrings:@"Test message", @"Test letter", nil]);
NSLog( @"%d", [string isEqualToStrings:@"Test message", @"Test string", nil]);
2016-09-08 21:43:41.278 libtest[1584:133885] 0
2016-09-08 21:43:41.279 libtest[1584:133885] 1
Расширение строк
Категория NSString(SCString) декларирует следующие методы расширения строк:
- (NSString *)leftExpandedStringToLength:(
SCIndex)length character:(unichar)character;
- (NSString *)leftExpandedStringToLength:(
SCIndex)length;
- (NSString *)leftZeroExpandedStringToLength:(
SCIndex)length;
- (NSString *)rightExpandedStringToLength:(
SCIndex)length character:(unichar)character;
- (NSString *)rightExpandedStringToLength:(
SCIndex)length;
- Метод leftExpandedStringToLength:character: возвращает текущую строку, расширенную до указанного количества символов заданными символами. Новые символы добавляются в начало строки. Если длина исходной строки больше заданной, возвращается исходная строка:
NSString *string = @"Sample String";
NSLog( @"%@", [string leftExpandedStringToLength:15 character:'*']);
2016-09-08 22:46:02.279 libtest[1769:167644] **Sample String
- Метод leftExpandedStringToLength: возвращает текущую строку, дополненную ведущими пробелами до заданного количества символов:
NSString *string = @"Sample";
NSLog( @"#%@#", [string leftExpandedStringToLength:10]);
2016-09-08 22:48:06.698 libtest[1795:169511] # Sample#
- Метод leftZeroExpandedStringToLength: возвращает текущую строку, дополненную до указанной длины ведущими нулями:
NSString *string = @"2319";
NSLog( @"%@", [string leftZeroExpandedStringToLength:8]);
2016-09-08 22:50:38.417 libtest[1833:172009] 00002319
- Метод rightExpandedStringToLength:character: расширяет текущую строку до заданной длины указанными замыкающими символами:
NSString *string = @"Message_";
NSLog( @"%@", [string rightExpandedStringToLength:12 character:'*']);
2016-09-08 22:53:18.040 libtest[1862:174043] Message_****
- Метод rightExpandedStringToLength: возвращает расширенную до заданной длины замыкающими пробелами исходную строку:
NSString *string = @"Sample";
NSLog( @"#%@#", [string rightExpandedStringToLength:10]);
2016-09-08 22:54:37.596 libtest[1884:175283] #Sample #
Кроме вышеописанных методов категория NSString(SCString) декларирует классовые методы, создающие строки с расширением до указанной длины соответствующими символами на основании заданных исходных строк:
+ (instancetype)stringWithLeftExpandedString:(NSString *)string length:(
SCIndex)length character:(unichar)character;
+ (instancetype)stringWithLeftExpandedString:(NSString *)string length:(
SCIndex)length;
+ (instancetype)stringWithLeftZeroExpandedString:(NSString *)string length:(
SCIndex)length;
+ (instancetype)stringWithRightExpandedString:(NSString *)string length:(
SCIndex)length character:(unichar)character;
+ (instancetype)stringWithRightExpandedString:(NSString *)string length:(
SCIndex)length;
Аналогичные функции выполняют методы инициализации строк:
- (instancetype)initWithLeftExpandedString:(NSString *)string length:(
SCIndex)length character:(unichar)character;
- (instancetype)initWithLeftExpandedString:(NSString *)string length:(
SCIndex)length;
- (instancetype)initWithLeftZeroExpandedString:(NSString *)string length:(
SCIndex)length;
- (instancetype)initWithRightExpandedString:(NSString *)string length:(
SCIndex)length character:(unichar)character;
- (instancetype)initWithRightExpandedString:(NSString *)string length:(
SCIndex)length;
Добавление разделителей групп символов
Методы, возвращающие разделенные на группы символов строки, декларированы в категории NSString(SCString) следующим образом:
- (NSString *)stringWithSeparator:(NSString *)separator left:(
SCIndex)left;
- (NSString *)stringWithSpacesLeft:(
SCIndex)left;
- (NSString *)stringWithSeparator:(NSString *)separator right:(
SCIndex)right;
- (NSString *)stringWithSpacesRight:(
SCIndex)right;
- Метод stringWithSeparator:left: возвращает исходную строку, в которую через указанные промежутку, начиная с первого символа, вставлены заданные разделители:
NSString *string = @"123456789";
NSLog( @"%@", [string stringWithSeparator:@"-" left:4]);
2016-09-12 09:40:37.340 libtest[944:21744] 1234-5678-9
- Метод stringWithSpacesLeft: возвращает исходную строку со вставленными в нее через указанные промежутки пробелами, начиная с первого символа исходной строки:
NSString *string = @"123456789";
NSLog( @"%@", [string stringWithSpacesLeft:2]);
2016-09-12 10:02:21.074 libtest[1010:33187] 12 34 56 78 9
- Метод stringWithSeparator:right: возвращает строку, в которую начиная с последнего символа исходной строки через заданные промежутки добавляется указанный разделитель:
NSString *string = @"123456789";
NSLog( @"%@", [string stringWithSeparator:@"-" right:5]);
2016-09-12 10:17:07.824 libtest[1059:41867] 1234-56789
- Метод stringWithSpacesRight: возвращает строку с добавленными в нее справа налево (начиная с последнего символа) пробелами через указанное количество символов:
NSString *string = @"123456789";
NSLog( @"%@", [string stringWithSpacesRight:4]);
2016-09-12 10:25:54.572 libtest[1094:49088] 1 2345 6789
Кроме методов, возвращающих строки с добавленными разделителями, категория NSString(SCString) декларирует классовые методы и методы инициализации новых строк с добавленными разделителями на основе существующих исходных строк:
+ (instancetype)stringWithString:(NSString *)string separator:(NSString *)separator left:(
SCIndex)left;
+ (instancetype)stringWithString:(NSString *)string spacesLeft:(
SCIndex)left;
+ (instancetype)stringWithString:(NSString *)string separator:(NSString *)separator right:(
SCIndex)right;
+ (instancetype)stringWithString:(NSString *)string spacesRight:(
SCIndex)right;
- (instancetype)initWithString:(NSString *)string separator:(NSString *)separator left:(
SCIndex)left;
- (instancetype)initWithString:(NSString *)string spacesLeft:(
SCIndex)left;
- (instancetype)initWithString:(NSString *)string separator:(NSString *)separator right:(
SCIndex)right;
- (instancetype)initWithString:(NSString *)string spacesRight:(
SCIndex)right;
Работа с текстовыми представлениями различных типов данных
Данная глава описывает свойства и методы категории NSString(SCString), обеспечивающие взаимодействие между числовыми данными и их текстовыми представлениями в виде строк.
Определение наличия в строках чисел
Категория NSString(SCString) объявляет ряд методов, позволяющих определить, является ли та или иная строка символьным представлением числа в различных форматах:
- (BOOL)isBinaryString;
- (BOOL)isOctalString;
- (BOOL)isDecimalString;
- (BOOL)isHexadecimalString;
- (BOOL)isBooleanString;
- (BOOL)isFloatString;
- (BOOL)isDoubleString;
- Метод isBinaryString возвращает значение YES, если строка является символьным представлением целого двоичного числа, то есть содержит только символы "0" и "1" (также допускаются как ведущие и замыкающие пробелы, так и пробелы между цифрами - если двоичное число представлено с разделителями).
- Метод isOctalString определяет, является ли строка символьным представлением целого восьмеричного числа. Метод возвращает значение YES, если строка содержит только цифры от "0" до "7" и пробелы в качестве разделителей групп цифр в числе. Если в строке встречаются другие символы, возвращается значение NO.
- Метод isDecimalString возвращает значение YES, если проверяемая строка не содержит никаких символов, кроме цифр от "0" до "9", пробелов и символов "+" и "-". В противном случае метод возвращает значение NO.
- Метод isHexadecimalString определяет, является ли строка символьным представлением шестнадцатеричного целого числа. Возвращается значение YES, если в строке содержатся цифры от "0" до "9", буквы "a" - "f" и "A" - "F", знак "0x" и пробелы в качестве разделителей групп цифр. В противном случае возвращается значение NO.
- Метод isBooleanString возвращает значение YES в том случае, если строка содержит символьное представление логического значения (YES, NO, True, False и так далее).
- Методы isFloatString и isDoubleString определяют, является ли строка текстовым представлением чисел с плавающей точкой одинарной и двойной точности.
Преобразование строк в числовой формат
Категория NSString(SCString) объявляет ряд свойств и методов для преобразования различных текстовых представлений чисел в целые и логические значения:
@property (nonatomic, assign, readonly, getter=binaryValue)
SCULong binaryValue;
@property (nonatomic, assign, readonly, getter=octalValue)
SCULong octalValue;
@property (nonatomic, assign, readonly, getter=decimalValue)
SCULong decimalValue;
@property (nonatomic, assign, readonly, getter=hexadecimalValue)
SCULong hexadecimalValue;
@property (nonatomic, assign, readonly, getter=booleanValue) BOOL booleanValue;
- (BOOL)booleanValue;
- Свойство binaryValue возвращает целое число на основании его двоичного представления в исходной строке. Если строка не содержит двоичное число или в представлении двоичного числа будут обнаружены недопустимые для данного представления символы, свойство возвращает значение 0.
NSString *string = @"0100 1011";
NSLog( @"%d", string.binaryValue);
2016-09-12 12:49:09.030 libtest[1857:153790] 75
- Свойство octalValue возвращает целое число исходя из его восьмеричного представления в исходной строке:
NSString *string = @"0640";
NSLog( @"%d", [string octalValue]);
2016-09-12 12:50:28.740 libtest[1888:155362] 416
- С помощью свойства decimalValue из десятичного представления числа в исходной строки возвращается его значение в виде целого числа:
NSString *string = @"318 423";
NSLog( @"%d", string.decimalValue);
2016-09-12 12:51:50.971 libtest[1930:157194] 318423
- Свойство hexadecimalValue возвращает целое число, соответствующее его шестнадцатеричному представлению в исходной строке:
NSString *string = @"0x04AE78FB";
NSLog( @"%d", [string hexadecimalValue]);
2016-09-12 12:53:36.004 libtest[1951:158783] 78543099
- Свойство booleanValue возвращает логическое значение на основании его символьного представления в исходной строке:
NSLog( @"%d", [@"Yes" booleanValue]);
NSLog( @"%d", @"True".booleanValue);
2016-09-12 12:56:53.526 libtest[2008:162575] 1
2016-09-12 12:56:53.526 libtest[2008:162575] 1
Создание символьных представлений чисел
Категория NSString(SCString) объявляет ряд классовых методов, возвращающих созданные текстовые представления целых чисел и логических значений:
+ (instancetype)stringWithBinaryInteger:(
SCULong)integer capacity:(
SCCapacity)capacity;
+ (instancetype)stringWithBinaryInteger:(
SCULong)integer;
+ (instancetype)stringWithOctalInteger:(
SCULong)integer;
+ (instancetype)stringWithDecimalInteger:(
SCLong)integer separators:(BOOL)separators;
+ (instancetype)stringWithDecimalInteger:(
SCLong)integer;
+ (instancetype)stringWithInteger:(
SCLong)integer;
+ (instancetype)stringWithHexadecimalInteger:(
SCULong)integer capacity:(
SCCapacity)capacity;
+ (instancetype)stringWithHexadecimalInteger:(
SCULong)integer;
+ (instancetype)stringWithBool:(BOOL)boolean;
+ (instancetype)stringWithFloat:(
SCFloat)value;
+ (instancetype)stringWithDouble:(
SCDouble)value;
- Классовый метод stringWithBinaryInteger:capacity: создает строку в виде двоичного представления указанного целого числа. Разрядность текстового представления определяется вторым аргументом метода.
NSString *string = [NSString stringWithBinaryInteger:1909 capacity:SCWordCapacity];
NSLog( @"%@", string);
2016-09-12 13:34:06.426 libtest[2271:191971] 00000111 01110101
- Классовый метод stringWithBinaryInteger: действует аналогично методу stringWithBinaryInteger:capacity:, но отличается от него тем, что возвращает исходное число в виде либо 32-х битного, либо 64-х битного двоичного представления (в зависимости от разрядности исходного числа).
NSString *string = [NSString stringWithBinaryInteger:1909];
NSLog( @"%@", string);
2016-09-12 13:35:02.276 libtest[2289:193446] 00000000 00000000 00000111 01110101
- Классовый метод stringWithOctalInteger: возвращает строку, созданную в виде восьмеричного представления заданного целого числа:
NSString *string = [NSString stringWithOctalInteger:1909];
NSLog( @"%@", string);
2016-09-12 13:37:49.867 libtest[2317:196790] 3565
- Классовый метод stringWithDecimalInteger:separators: возвращает строку, являющуюся десятичным представлением указанного целого числа. Если второй аргумент метода устанавливается равным YES, в созданное представление добавляются разделители тысяч.
NSString *string = [NSString stringWithDecimalInteger:19091975 separators:YES];
NSLog( @"%@", string);
2016-09-12 13:38:33.963 libtest[2342:197280] 19 091 975
- Классовый метод stringWithDecimalInteger: также возвращает десятичное представление заданного целого числа, однако не добавляет в получившуюся строку разделители тысяч:
NSString *string = [NSString stringWithDecimalInteger:19091975];
NSLog( @"%@", string);
2016-09-12 13:39:33.242 libtest[2361:198731] 19091975
- Классовый метод stringWithInteger: является аналогом классового метода stringWithDecimalInteger:
NSString *string = [NSString stringWithInteger:1909];
NSLog( @"%@", string);
2016-09-12 13:40:31.283 libtest[2380:199859] 1909
- Классовый метод stringWithHexadecimalInteger:capacity: создает строку в виде шестнадцатеричного представления указанного числа с использованием заданной разрядности:
NSString *string = [NSString stringWithHexadecimalInteger:19091975 capacity:SCIntCapacity];
NSLog( @"%@", string);
2016-09-12 13:43:03.999 libtest[2430:202816] 0123 5207
- Классовый метод stringWithHexadecimalInteger: возвращает строку, созданную в виде шестнадцатеричного представления заданного целого 64-х битного числа:
NSString *string = [NSString stringWithHexadecimalInteger:19091975];
NSLog( @"%@", string);
2016-09-12 13:43:58.910 libtest[2447:203955] 0000 0000 0123 5207
- Классовый метод stringWithBool: создает строку на основе текстового представления указанного логического значения:
NSString *string = [NSString stringWithBool:YES];
NSLog( @"%@", string);
2016-09-12 13:45:09.607 libtest[2465:205489] YES
- Классовый метод stringWithFloat: возвращает строку, созданную как текстовое представление заданного числа с плавающей точкой одинарной точности:
NSString *string = [NSString stringWithFloat:1909.1975];
NSLog( @"%@", string);
2016-09-12 13:47:10.766 libtest[2512:207546] 1909.197510
- Классовый метод stringWithDouble: создает текстовое представление указанного числа с плавающей точкой двойной точности:
NSString *string = [NSString stringWithDouble:1909.1975];
NSLog( @"%@", string);
2016-09-12 13:48:23.241 libtest[2535:208992] 1909.197500
Инициализация символьных представлений чисел
Категория NSString(SCString) декларирует ряд методов для инициализации строк как различных представлений чисел и логических значений:
- (instancetype)initWithBinaryInteger:(
SCULong)integer capacity:(
SCCapacity)capacity;
- (instancetype)initWithBinaryInteger:(
SCULong)integer;
- (instancetype)initWithOctalInteger:(
SCULong)integer;
- (instancetype)initWithDecimalInteger:(
SCLong)integer separators:(BOOL)separators;
- (instancetype)initWithDecimalInteger:(
SCLong)integer;
- (instancetype)initWithInteger:(
SCLong)integer;
- (instancetype)initWithHexadecimalInteger:(
SCULong)integer capacity:(
SCCapacity)capacity;
- (instancetype)initWithHexadecimalInteger:(
SCULong)integer;
- (instancetype)initWithBool:(BOOL)boolean;
- (instancetype)initWithFloat:(
SCFloat)value;
- (instancetype)initWithDouble:(
SCDouble)value;
- Метод initWithBinaryInteger:capacity: инициализирует строку в виде двоичного представления заданного целого числа указанной разрядности.
- Метод initWithBinaryInteger: выполняет инициализацию строки в виде двоичного представления указанного целого 32-х битного целого числа.
- Метод initWithOctalInteger: возвращает строку, инициализированную как восьмеричное представление указанного целого числа.
- Метод initWithDecimalInteger:separators: инициализирует строку как десятичное представление заданного целого числа с использованием или без использования разделителей тысяч.
- Методы initWithDecimalInteger: и initWithInteger: возвращают инициализированное текстовое представление указанного целого числа.
- Метод initWithHexadecimalInteger:capacity: осуществляет инициализацию строки как шестнадцатеричного представления указанного целого числа с заданной разрядностью.
- Метод initWithHexadecimalInteger: инициализирует строку в виде шестнадцатеричного представления указанного целого числа с разрядностью 64 бита.
- Метод initWithBool: возвращает строку, инициализированную с использованием заданного логического значения.
- Методы initWithFloat: и initWithDouble: инициализируют строки как текстовые представления заданных чисел с плавающей точкой одинарной или двойной точности.
Реверсирование строк
Реверсирование строк осуществляется следующими методами категории NSString(SCString):
@property (nonatomic, retain, readonly, getter=reversedString) NSString *reversedString;
- (NSString *)reversedString;
+ (instancetype)stringWithReversedString:(NSString *)string;
- (instancetype)initWithReversedString:(NSString *)string;
- Свойство reversedString возвращает исходную строку с обратным (реверсированным) порядком следования символов:
NSString *string = @"0123456789";
NSLog( @"%@", string.reversedString);
2016-09-12 21:57:17.443 libtest[1601:139563] 9876543210
- Классовый метод stringWithReversedString: создает строку в виде реверсированной исходной строки.
- Метод initWithReversedString: инициализирует строку как реверсированную исходную строку.
Другие методы
Кроме вышеперечисленных свойств и методов категория NSString(SCString) декларирует следующие методы и свойства, которые нельзя отнести к какой-либо конкретной группе:
@property (nonatomic, assign, readonly, getter=empty) BOOL empty;
- (BOOL)empty;
- (NSString *)stringWithUpperFirstLetter;
- Свойство empty предоставляtт программный способ определить наличие в строке каких-либо информативных символов (символов, отличных от пробелов и знаков табуляции):
NSString *string = @" ";
NSLog( @"%d", string.empty);
string = @"Sample String";
NSLog( @"%d", [string empty]);
2016-09-14 12:22:49.854 libtest[1963:133269] 1
2016-09-14 12:22:49.854 libtest[1963:133269] 0
- Метод stringWithUpperFirstLetter возвращает исходную строку после преобразования первого ее символа к верхнему регистру, а остальных символов - к нижнему регистру:
NSString *string = @"sample string";
NSLog( @"%@", [string stringWithUpperFirstLetter]);
2016-09-14 12:49:52.368 libtest[3440:148768] Sample string
Расширения стандартных классов
В предыдущем разделе была описана категория NSString(SCString), расширяющая функциональность стандартного класса NSString. Кроме этого класса многие другие стандартные классы получили в нашей библиотеке дополнительную функциональность. В данном разделе мы опишем расширения следующих классов:
Расширение класса NSObject
Базовый стандартный класс NSObject реализует стандартные для всех классов возможности. Именно поэтому нами была создана категория NSObject(SCObject), через которую мы добавляем поддержку механизмов нашей библиотеки сразу во все классы, прежде всего поддержку протоколов SCCoding, SCDictionaring, SCStreaming и SCCollectioning.
Хотим обратить внимание, что соответствие данным протоколам не гарантирует, что экземпляр любого дочернего класса будет поддерживать соответствующий механизм, поскольку для полной поддержки необходима реализация ее путем перекрытия соответствующих методов через создание категории или дочернего класса.
Поддержка последовательных файлов
Для обеспечения поддержки последовательных файлов путем реализации протокола SCCoding категория NSObject(SCObject) декларирует следующие методы:
- (instancetype)initWithCoder:(NSCoder *)coder;
- (instancetype)initWithContentsOfSerializedFile:(NSString *)path;
- (void)encodeWithCoder:(NSCoder *)coder;
- (BOOL)writeContentsToSerializedFile:(NSString *)path;
Поддержка словарей
В целях обеспечения поддержки словарей через реализацию методов протокола SCDictionaring категория NSObject(SCObject) объявляет следующие методы:
- (instancetype)initWithDataDictionary:(NSDictionary *)dictionary;
- (instancetype)initWithDataDictionaryFromFile:(NSString *)path;
- (void)writeToDataDictionary:(NSMutableDictionary *)dictionary;
- (void)writeToDataDictionaryFile:(NSString *)path atomically:(BOOL)atomically;
- (void)writeToDataDictionaryFile:(NSString *)path;
- (NSDictionary *)dataDictionary;
Поддержка потоков
Реализуя следующие методы протокола SCStreaming категория NSObject(SCObject) обеспечивает поддержку потоков:
- (instancetype)initWithStream:(
SCStream *)stream;
- (instancetype)initWithFileStream:(NSString *)path;
- (void)writeToStream:(
SCStream *)stream;
- (void)writeToFileStream:(NSString *)path;
- (void)appendToFileStream:(NSString *)path;
Поддержка коллекций
Чтобы обеспечить поддержку коллекций категория NSObject(SCObject) реализует следующие методы протокола SCCollectioning:
Расширение класса NSNumber
Класс числовых объектов NSNumber обеспечивает в стандартной библиотеке возможности по работе с целыми числами, логическими значениями и числами с плавающей точкой. Большое значение данного класса для всего языка Objective C обусловило необходимость его расширения как для поддержки стандартных механизмов библиотеки, так и для внесения в класс дополнительной функциональности.
Создание числовых объектов
Категория NSNumber(SCNumber) реализует ряд классовых методов для создания числовых объектов на основании данных из последовательных файлов, словарей и потоков:
+ (instancetype)numberWithCoder:(NSCoder *)coder;
+ (instancetype)numberWithContentsOfSerializedFile:(NSString *)path;
+ (instancetype)numberWithDataDictionary:(NSDictionary *)dictionary;
+ (instancetype)numberWithDataDictionaryFromFile:(NSString *)path;
+ (instancetype)numberWithStream:(
SCStream *)stream;
+ (instancetype)numberWithFileStream:(NSString *)path;
Категория NSNumber(SCNumber) декларирует ряд классовых методов для создания экземпляров класса на основании данных других типов:
+ (instancetype)numberWithNumber:(NSNumber *)number;
+ (instancetype)numberWithByte:(
SCByte)byte;
+ (instancetype)numberWithUnsignedByte:(
SCUByte)byte;
+ (instancetype)numberWithUnichar:(unichar)chr;
- Классовый метод numberWithNumber: создает копию существующего числового объекта:
NSNumber *source = @2319;
NSNumber *number = [NSNumber numberWithNumber:source];
NSLog( @"%@", number);
2016-09-14 13:48:55.679 libtest[3764:190588] 2319
- Классовые методы numberWithByte: и numberWithUnsignedByte: возвращают числовой объект, созданный с использованием указанного 8-битного знакового или беззнакового целого числа:
NSLog( @"%@", [NSNumber numberWithByte:-66]);
NSLog( @"%@", [NSNumber numberWithUnsignedByte:115]);
2016-09-14 13:52:54.389 libtest[3811:194414] -66
2016-09-14 13:52:54.390 libtest[3811:194414] 115
- Классовый метод numberWithUnichar: создает числовой объект с использованием указанного символа:
NSNumber *number = [NSNumber numberWithUnichar:'Z'];
NSLog( @"%@", number);
2016-09-14 14:03:36.193 libtest[3850:198228] 90
Создание числовых объектов на основании их текстового представления того или иного формата осуществляется рядом классовым методов категории NSNumber(SCNumber):
+ (instancetype)numberWithBinaryString:(NSString *)string;
+ (instancetype)numberWithOctalString:(NSString *)string;
+ (instancetype)numberWithDecimalString:(NSString *)string;
+ (instancetype)numberWithHexadecimalString:(NSString *)string;
+ (instancetype)numberWithString:(NSString *)string;
+ (instancetype)numberWithBoolString:(NSString *)string;
+ (instancetype)numberWithFloatString:(NSString *)string;
+ (instancetype)numberWithDoubleString:(NSString *)string;
- Классовый метод numberWithBinaryString: создает числовой объект с использованием указанного двоичного представления целого числа:
NSNumber *number = [NSNumber numberWithBinaryString:@"01100011"];
NSLog( @"%@", number);
2016-09-14 14:05:56.103 libtest[3874:200221] 99
- Классовый метод numberWithOctalString: возвращает числовой объект, созданный на основе заданного восьмеричного представления целого числа:
NSNumber *number = [NSNumber numberWithOctalString:@"0644"];
NSLog( @"%@", number);
2016-09-14 14:18:30.892 libtest[3921:208773] 420
- С помощью классового метода numberWithDecimalString: создается числовой объект на основе указанного исходного десятичного представления целого числа. Метод является аналогом классового метода numberWithString:.
NSNumber *number = [NSNumber numberWithDecimalString:@"283 044"];
NSLog( @"%@", number);
2016-09-14 14:20:40.399 libtest[3936:210127] 283044
- Классовый метод numberWithHexadecimalString: возвращает числовой объект, созданный с применением указанного исходного текстового представления целого числа:
NSNumber *number = [NSNumber numberWithHexadecimalString:@"0x0DF4"];
NSLog( @"%@", number);
2016-09-14 14:23:47.962 libtest[3957:212381] 3572
- Классовый метод numberWithString: является аналогом метода numberWithDecimalString: и также возвращает числовой объект, соответствующий указанному десятичному представлению числа:
NSNumber *number = [NSNumber numberWithString:@"19091975"];
NSLog( @"%@", number);
2016-09-14 14:26:16.674 libtest[3976:214197] 19091975
- Использование классового метода numberWithBoolString: позволяет создать числовой объект на основе текстового представления логической переменной:
NSNumber *number = [NSNumber numberWithBoolString:@"True"];
NSLog( @"%@", number);
2016-09-14 14:29:39.219 libtest[3996:216535] 1
- Классовый метод numberWithFloatString: создает числовой объект на основании текстового представления числа с плавающей точкой одинарной точности:
NSNumber *number = [NSNumber numberWithFloatString:@"1909.1975"];
NSLog( @"%@", number);
2016-09-14 14:35:19.441 libtest[4020:221106] 1909.198
- Классовый метод numberWithDoubleString: возвращает числовой объект, созданный на основании заданного текстового представления числа с плавающей точкой двойной точности:
NSNumber *number = [NSNumber numberWithDoubleString:@"1975.1909"];
NSLog( @"%@", number);
2016-09-14 14:37:51.538 libtest[4035:222530] 1975.1909
Инициализация числовых объектов
Категория NSNumber(SCNumber) определяет ряд методов инициализации экземпляров класса с использованием существующих данных каких-либо типов:
- (instancetype)initWithNumber:(NSNumber *)number;
- (instancetype)initWithByte:(
SCByte)byte;
- (instancetype)initWithUnsignedByte:(
SCUByte)byte;
- (instancetype)initWithUnichar:(unichar)chr;
- Метод initWithNumber: инициализирует копию существующего числового объекта.
- Методы initWithByte: и initWithUnsignedByte: выполняют инициализацию числового объекта с использованием заданного 8-битного знакового или беззнакового целого числа.
- Метод initWithUnichar: инициализирует числовой объект с использованием указанного символа.
Категория NSNumber(SCNumber) декларирует методы для инициализации экземпляров класса с использованием различных видов текстовых представлений чисел:
- (instancetype)initWithBinaryString:(NSString *)string;
- (instancetype)initWithOctalString:(NSString *)string;
- (instancetype)initWithDecimalString:(NSString *)string;
- (instancetype)initWithHexadecimalString:(NSString *)string;
- (instancetype)initWithString:(NSString *)string;
- (instancetype)initWithBoolString:(NSString *)string;
- (instancetype)initWithFloatString:(NSString *)string;
- (instancetype)initWithDoubleString:(NSString *)string;
Свойства экземпляров класса
Категория NSNumber(SCNumber) объявляет следующие свойства:
@property (nonatomic, assign, readonly, getter=byteValue)
SCByte byteValue;
@property (nonatomic, assign, readonly, getter=unsignedByteValue)
SCUByte unsignedByteValue;
@property (nonatomic, assign, readonly, getter=unicharValue) unichar unicharValue;
- Свойства byteValue и unsignedByteValue возвращают значение числового объекта как 8-битное знаковое или беззнаковое целое значение:
NSNumber *number = [NSNumber numberWithInteger:-74];
NSLog( @"Signed byte: %d", number.byteValue);
NSLog( @"Unsigned byte: %d", [number unsignedByteValue]);
2016-09-14 15:55:07.633 libtest[4421:269305] Signed byte: -74
2016-09-14 15:55:07.633 libtest[4421:269305] Unsigned byte: 182
- Свойство unicharValue возвращает значение числового объекта в виде символа:
NSNumber *number = [NSNumber numberWithInteger:68];
NSLog( @"Unichar: %c", number.unicharValue);
2016-09-14 15:57:51.406 libtest[4445:271133] Unichar: D
Кроме вышеперечисленных свойств в категории NSNumber(SCNumber) объявлены свойства для получения различных текстовых представлений числовых объектов:
@property (nonatomic, assign, readonly, getter=binaryString) NSString *binaryString;
@property (nonatomic, retain, readonly, getter=octalString) NSString *octalString;
@property (nonatomic, retain, readonly, getter=decimalString) NSString *decimalString;
@property (nonatomic, retain, readonly, getter=string) NSString *string;
@property (nonatomic, retain, readonly, getter=hexadecimalString) NSString *hexadecimalString;
@property (nonatomic, retain, readonly, getter=boolString) NSString *boolString;
@property (nonatomic, retain, readonly, getter=floatString) NSString *floatString;
@property (nonatomic, retain, readonly, getter=doubleString) NSString *doubleString;
- Свойство binaryString возвращает двоичное представление числового объекта:
NSNumber *number = @19091975;
NSLog( @"Binary: %@", number.binaryString);
2016-09-14 16:01:33.879 libtest[4472:273787] Binary: 00000001 00100011 01010010 00000111
- Свойство octalString возвращает восьмеричное представление числового объекта:
NSNumber *number = @19091975;
NSLog( @"Octal: %@", number.octalString);
2016-09-14 16:02:17.224 libtest[4485:274810] Octal: 110651007
- Свойства decimalString и string возвращают десятичного представление числового объекта:
NSNumber *number = @19091975;
NSLog( @"Decimal: %@", [number decimalString]);
NSLog( @"Decimal: %@", number.string);
2016-09-14 16:09:20.171 libtest[4501:277438] Decimal: 19091975
2016-09-14 16:09:20.171 libtest[4501:277438] Decimal: 19091975
- Свойство hexadecimalString возвращает шестнадцатеричное представление числового объекта:
NSNumber *number = @19091975;
NSLog( @"Hex: %@", number.hexadecimalString);
2016-09-14 16:11:04.706 libtest[4516:278723] Hex: 0000 0000 0123 5207
- Через свойство boolString доступно текстовое представление числового объекта как логического значения:
NSNumber *number = @1;
NSLog( @"Boolean: %@", number.boolString);
2016-09-14 16:13:11.751 libtest[4553:280427] Boolean: YES
- Свойство floatString предоставляет доступ к текстовому представлению числового объекта как числа с плавающей точкой одинарной точности:
NSNumber *number = @1909.1975;
NSLog( @"Float: %@", number.floatString);
2016-09-14 16:15:19.865 libtest[4590:281896] Float: 1909.197510
- Свойство doubleString возвращает текстовое представление числового объекта как значения с плавающей точкой двойной точности:
NSNumber *number = @1909.1975;
NSLog( @"Double: %@", number.doubleString);
2016-09-14 16:17:24.308 libtest[4605:283251] Double: 1909.197500
Определение типов числовых объектов
Числовой объект NSNumber может содержать данные различного типа, который определяется при создании экземпляра класса. Для получения информации о типе числового объекта категория NSNumber(SCNumber) используется метод type, объявленный в категории следующим образом:
Метод возвращает идентификатор типа числового объекта. Подробнее доступные идентификаторы описаны в разделе стандартные типы данных данного руководства.
NSNumber *number = [NSNumber numberWithShort:1909];
if ( number.type ==
SCTypeShort) NSLog(
@"number is signed short");
2016-09-14 17:33:22.302 libtest[5377:337635] number is signed short
Сравнение экземпляров класса
Для выполнения операций сравнения числовых объектов с различными типами данных, категория NSNumber(SCNumber) определяет ряд методов, которые возвращают значение YES если проверяемый числовой объект соответствует указанному в качестве аргумента соответствующего метода значению:
- (BOOL)isEqualToByte:(
SCByte)value;
- (BOOL)isEqualToUnsignedByte:(
SCUByte)value;
- (BOOL)isEqualToShort:(
SCShort)value;
- (BOOL)isEqualToUnsignedShort:(
SCUShort)value;
- (BOOL)isEqualToUnsignedInteger:(
SCUInteger)value;
- (BOOL)isEqualToLongLong:(
SCLong)value;
- (BOOL)isEqualToUnsignedLongLong:(
SCULong)value;
- (BOOL)isEqualToChar:(char)value;
- (BOOL)isEqualToUnichar:(unichar)value;
- (BOOL)isEqualToBool:(BOOL)value;
- (BOOL)isEqualToFloat:(
SCFloat)value;
- (BOOL)isEqualToDouble:(
SCDouble)value;
Для выполнения сравнения числовых объектов с текстовыми представлениями данных (как представленных в виде экземпляров класса NSString, так и в виде классических строк) категория NSNumber(SCNumber) декларирует следующий ряд методов:
- (BOOL)isEqualToBinaryString:(NSString *)string;
- (BOOL)isEqualToOctalString:(NSString *)string;
- (BOOL)isEqualToDecimalString:(NSString *)string;
- (BOOL)isEqualToHexadecimalString:(NSString *)string;
- (BOOL)isEqualToString:(NSString *)string;
- (BOOL)isEqualToBoolString:(NSString *)string;
- (BOOL)isEqualToFloatString:(NSString *)string;
- (BOOL)isEqualToDoubleString:(NSString *)string;
Обработка ошибок
При работе с последовательными файлами, словарями, потоками и коллекциями мы можем столкнуться с ситуацией, когда вместо числового объекта будет обнаружен экземпляр другого класса. Для индикации данной ситуации нами была создана исключительная ситуация SCNumberException, реализующая на данный момент единственную ошибку SCL-20011.
Расширение класса NSNull
Категория NSNull(SCNull) не добавляет к классу NSNull никакой новой функциональности, за исключением классовых методов создания экземпляров класса на основании данных из последовательных файлов, словарей и потоков:
+ (instancetype)nullWithCoder:(NSCoder *)coder;
+ (instancetype)nullWithContentsOfSerializedFile:(NSString *)path;
+ (instancetype)nullWithDataDictionary:(NSDictionary *)dictionary;
+ (instancetype)nullWithDataDictionaryFromFile:(NSString *)path;
+ (instancetype)nullWithStream:(
SCStream *)stream;
+ (instancetype)nullWithFileStream:(NSString *)path;
Расширение класса NSDate
Как и категория NSNull(SCNull), категория NSDate(SCDate) расширяет функциональность класса NSDate методами для создания экземпляров класса на основании данных из последовательных файлов, словарей и потоков:
+ (instancetype)dateWithCoder:(NSCoder *)coder;
+ (instancetype)dateWithContentsOfSerializedFile:(NSString *)path;
+ (instancetype)dateWithDataDictionary:(NSDictionary *)dictionary;
+ (instancetype)dateWithDataDictionaryFromFile:(NSString *)path;
+ (instancetype)dateWithStream:(
SCStream *)stream;
+ (instancetype)dateWithFileStream:(NSString *)path;
Расширение класса NSArray
Категория NSArray(SCArray) добавляет в стандартный класс NSArray функциональность таких протоколов библиотеки, как SCCollection и SCIndexedCollection, обеспечивая совместимость со многими механизмами библиотеки.
Создание массивов
Категория NSArray(SCArray) декларирует следующие классовые методы для создания массивов на основе данных из последовательных файлов, словарей и потоков:
+ (instancetype)arrayWithCoder:(NSCoder *)coder;
+ (instancetype)arrayWithContentsOfSerializedFile:(NSString *)path;
+ (instancetype)arrayWithDataDictionary:(NSDictionary *)dictionary;
+ (instancetype)arrayWithDataDictionaryFromFile:(NSString *)path;
+ (instancetype)arrayWithStream:(
SCStream *)stream;
+ (instancetype)arrayWithFileStream:(NSString *)path;
Категория NSArray(SCArray) добавляет в класс NSArray следующие методы создания массивов:
+ (instancetype)arrayWithCollection:(
id<
SCCollection>)collection;
- Классовый метод arrayWithCollection: создает массив и копирует в него объекты из указанной коллекции любого поддерживаемого библиотекой типа:
NSArray *array = [NSArray arrayWithCollection:source];
NSLog( @"%@", array);
2016-09-15 09:50:39.632 libtest[863:19072] (
00,
10,
20
)
Инициализация массивов
Категория NSArray(SCArray) объявляет следующие дополнительные методы инициализации массивов:
- (instancetype)initWithCollection:(
id<
SCCollection>)collection;
- Метод initWithCollection: возвращает инициализированный массив с объектами из указанной исходной коллекции любого поддерживаемого библиотекой типа.
Реализация протокола SCCollection
Наиболее востребованными методами протокола SCCollection в классе NSArray являются следующие методы и свойства категории NSArray(SCArray):
@property (nonatomic, assign, readonly, getter=empty) BOOL empty;
@property (nonatomic, assign, readonly, getter=readOnly) BOOL readOnly;
- (BOOL)empty;
- (BOOL)readOnly;
- Свойство empty возвращает значение YES для пустого массива (не содержащего ни одного элемента) и значение NO для массива, в котором присутствует хотя бы один объект:
NSArray *array = [NSArray arrayWithObjects:@"00", @"01", @"02", nil];
if ( !array.empty) NSLog( @"Array contents objects");
2016-09-15 12:56:20.747 libtest[1697:126956] Array contents objects
- Свойство readOnly возвращает значение YES, если массив доступен только для чтения данных из него. Обращаем внимание, что данное свойство экземпляров класса NSArray всегда возвращает значение YES, тогда как для экземпляра дочернего класса NSMutableArray оно всегда будет равным NO. Это связано с тем, что класс NSArray не допускает изменения своего содержимого, тогда как класс NSMutableArray такие изменения допускает. Также обращаем внимание на то, что изменить значение данного свойства для экземпляров классов NSArray и NSMutableArray невозможно.
Также для реализации протокола SCCollection категория NSArray(SCArray) реализует методы определения типов коллекций:
- (BOOL)isCollection;
- (BOOL)isLibraryCollection;
- (BOOL)isFoundationCollection;
- (BOOL)isArray;
- (BOOL)isLibraryArray;
- (BOOL)isFoundationArray;
- (BOOL)isSet;
- (BOOL)isLibrarySet;
- (BOOL)isFoundationSet;
- (BOOL)isOrderedSet;
- (BOOL)isLibraryOrderedSet;
- (BOOL)isFoundationOrderedSet;
- (BOOL)isDictionary;
- (BOOL)isLibraryDictionary;
- (BOOL)isFoundationDictionary;
- (BOOL)isStack;
- (BOOL)isQueue;
- (BOOL)isList;
- (BOOL)isSortable;
Для экземпляров класса NSArray и его потомка NSMutableArray значение YES возвращают методы:
- isCollection
- isFoundationCollection
- isArray
- isFoundationArray
- isSortable
Остальные методы из этого списка возвращают значение NO.
Поиск объектов массивов
Категория NSArray(SCArray) реализует следующие методы поиска объектов из протокола SCCollection:
- (BOOL)containsAnyObjectFromCollection:(
id<
SCCollection>)collection;
Преобразование массивов
В соответствии с протоколом SCCollection категория NSArray(SCArray) реализует свойства и методы преобразования массивов типа NSArray в другие виды поддерживаемых библиотекой коллекций:
@property (nonatomic, retain, readonly, getter=array)
SCArray *array;
@property (nonatomic, retain, readonly, getter=set)
SCSet *set;
@property (nonatomic, retain, readonly, getter=orderedSet)
SCOrderedSet *orderedSet;
@property (nonatomic, retain, readonly, getter=dictionary)
SCDictionary *dictionary;
@property (nonatomic, retain, readonly, getter=stack)
SCStack *stack;
@property (nonatomic, retain, readonly, getter=queue)
SCQueue *queue;
@property (nonatomic, retain, readonly, getter=unidirectionalList)
SCUnidirectionalList *unidirectionalList;
@property (nonatomic, retain, readonly, getter=bidirectionalList)
SCBidirectionalList *bidirectionalList;
@property (nonatomic, retain, readonly, getter=foundationArray) NSArray *foundationArray;
@property (nonatomic, retain, readonly, getter=foundationSet) NSSet *foundationSet;
@property (nonatomic, retain, readonly, getter=foundationOrderedSet) NSOrderedSet *foundationOrderedSet;
@property (nonatomic, retain, readonly, getter=foundationDictionary) NSDictionary *foundationDictionary;
@property (nonatomic, retain, readonly, getter=reversedArray) NSArray *reversedArray;
- (NSArray *)foundationArray;
- (NSSet *)foundationSet;
- (NSOrderedSet *)foundationOrderedSet;
- (NSDictionary *)foundationDictionary;
- (NSArray *)reversedArray;
Сортировка массивов
Согласно протоколу SCCollection категория NSArray(SCArray) реализует следующие свойства и методы сортировки содержимого массива:
@property (nonatomic, retain, readonly, getter=sortedArray) NSArray *sortedArray;
- (NSArray *)ascendingSortedArrayWithSorter:(
id<
SCSorter>)sorter;
- (NSArray *)descendingSortedArrayWithSorter:(
id<
SCSorter>)sorter;
- (NSArray *)sortedArrayWithSorter:(
id<
SCSorter>)sorter;
- (NSArray *)ascendingSortedArray;
- (NSArray *)descendingSortedArray;
- (NSArray *)sortedArray;
Также категория объявляет ряд методов для создания и инициализации массивов с отсортированными данными из указанных существующих коллекций любого поддерживаемого библиотекой типа:
+ (instancetype)arrayWithAscendingSortedCollection:(
id<
SCCollection>)collection sorter:(
id<
SCSorter>)sorter;
+ (instancetype)arrayWithDescendingSortedCollection:(
id<
SCCollection>)collection sorter:(
id<
SCSorter>)sorter;
+ (instancetype)arrayWithAscendingSortedCollection:(
id<
SCCollection>)collection;
+ (instancetype)arrayWithDescendingSortedCollection:(
id<
SCCollection>)collection;
+ (instancetype)arrayWithSortedCollection:(
id<
SCCollection>)collection;
- (instancetype)initWithAscendingSortedCollection:(
id<
SCCollection>)collection sorter:(
id<
SCSorter>)sorter;
- (instancetype)initWithDescendingSortedCollection:(
id<
SCCollection>)collection sorter:(
id<
SCSorter>)sorter;
- (instancetype)initWithAscendingSortedCollection:(
id<
SCCollection>)collection;
- (instancetype)initWithDescendingSortedCollection:(
id<
SCCollection>)collection;
- (instancetype)initWithSortedCollection:(
id<
SCCollection>)collection;
Расширение класса NSMutableArray
Категория NSMutableArray(SCMutableArray) дополняет класс NSMutableArray методами протоколов SCMutableCollection и SCMutableIndexedCollection, обеспечивая экземпляры класса совместимостью с механизмами коллекций. Совместимость с другими механизмами библиотеки наследуется классом NSMutableArray от класса NSArray и категории NSArray(SCArray).
Копирование массивов
Категория NSMutableArray(SCMutableArray) реализует следующие методу категории SCMutableCollection, выполняющие замену существующего содержимого массива:
Также категория декларирует методы, заменяющие текущее содержимое массива отсортированными объектами существующих коллекций:
- (void)setAscendingSortedCollection:(
id<
SCCollection>)collection;
- (void)setDescendingSortedCollection:(
id<
SCCollection>)collection;
Добавление элементов
Категория реализует следующие методы добавления объектов протокола SCMutableCollection:
Удаление элементов
Полную поддержку средств удаления объектов протокола SCMutableCollection обеспечивает реализация в категории NSMutableArray(SCMutableArray) следующих методов:
- (void)removeObjectsWithClass:(Class)oclass;
- (void)removeObjectsWithClassName:(NSString *)name;
Замена элементов массивов
Замена объектов массивов осуществляется следующими методами протокола SCMutableCollection, реализованными в категории NSMutableArray(SCMutableArray):
- (void)replaceObjectsAtIndexes:(NSIndexSet *)indexes withCollection:(
id<
SCCollection>)collection;
- (void)replaceObjectsInRange:(NSRange)range withObjects:(
id<
SCCollectioning>)object, ...;
- (void)replaceObjectsInRange:(NSRange)range withCollection:(
id<
SCCollection>)collection;
Сортировка массивов
Категория NSMutableArray(SCMutableArray) реализует следующие методы сортировки содержимого массивов:
- (void)sortAscendingWithSorter:(
id<
SCSorter>)sorter;
- (void)sortDescendingWithSorter:(
id<
SCSorter>)sorter;
- (void)sortWithSorter:(
id<
SCSorter>)sorter;
- (void)sortAscending;
- (void)sortDescending;
- (void)sort;
Дополнительные методы
Также категория NSMutableArray(SCMutableArray) декларирует следующие дополнительные методы:
- (void)copyObjectAtIndex:(
SCIndex)index toIndex:(
SCIndex)destination;
- (void)moveObjectAtIndex:(
SCIndex)index toIndex:(
SCIndex)destination;
- (void)reverse;
- Метод copyObjectAtIndex:toIndex: копирует объект с заданным индексом в позицию с указанным индексом.
- Метод moveObjectAtIndex:toIndex: перемещает элемент с указанным индексом в заданную позицию.
- Метод reverse выполняет изменения порядка следования объектов в массиве на обратный.
Расширение класса NSSet
Категория NSSet(SCSet) расширяет возможности стандартных неупорядоченных множеств как для взаимодействия с различными механизами библиотеки, так и для обеспечения совместимости с коллекциями библиотеки в целом и неупорядоченными множествами SCSet в частности.
Создание неупорядоченных множеств
Категория NSSet(SCSet) реализует следующие классовые методы для создания неупорядоченных множеств на основании данных из последовательных файлов, словарей и потоков:
+ (instancetype)setWithCoder:(NSCoder *)coder;
+ (instancetype)setWithContentsOfSerializedFile:(NSString *)path;
+ (instancetype)setWithDataDictionary:(NSDictionary *)dictionary;
+ (instancetype)setWithDataDictionaryFromFile:(NSString *)path;
+ (instancetype)setWithStream:(
SCStream *)stream;
+ (instancetype)setWithFileStream:(NSString *)path;
Категория декларирует следующие классовые методы создания неупорядоченных множеств:
+ (instancetype)setWithCollection:(
id<
SCCollection>)collection;
Инициализация неупорядоченных множеств
Категория объявляет дополнительные методы инициализации неупорядоченных множеств:
- (instancetype)initWithCollection:(
id<
SCCollection>)collection;
Реализация протокола SCCollection
В рамках реализации протокола SCCollection категория NSSet(SCSet) декларирует следующие свойства и методы:
@property (nonatomic, assign, readonly, getter=empty) BOOL empty;
@property (nonatomic, assign, readonly, getter=readOnly) BOOL readOnly;
- (BOOL)empty;
- (BOOL)readOnly;
- Свойство empty возвращает значение NO при наличии в неупорядоченном множестве хотя бы одного объекта и значение
YES в случае, когда неупорядоченное множество пусто, то есть не содержит ни одного объекта.
- Свойство readOnly определяет, допускает ли данный экземпляр класса изменения своего содержимого. Для экземпляров класса NSSet свойство всегда возвращает значение YES, тогда как для экземпляров класса-потомка NSMutableSet всегда возвращается значение NO.
Также категория реализует методы протокола SCCollection, служащие для определения принадлежности экземпляра класса к тому или иному типу коллекций:
- (BOOL)isCollection;
- (BOOL)isLibraryCollection;
- (BOOL)isFoundationCollection;
- (BOOL)isArray;
- (BOOL)isLibraryArray;
- (BOOL)isFoundationArray;
- (BOOL)isSet;
- (BOOL)isLibrarySet;
- (BOOL)isFoundationSet;
- (BOOL)isOrderedSet;
- (BOOL)isLibraryOrderedSet;
- (BOOL)isFoundationOrderedSet;
- (BOOL)isDictionary;
- (BOOL)isLibraryDictionary;
- (BOOL)isFoundationDictionary;
- (BOOL)isStack;
- (BOOL)isQueue;
- (BOOL)isList;
- (BOOL)isSortable;
Для стандартных упорядоченных множеств значение YES возвращают методы isCollection, isFoundationCollection, isSet и isFoundationSet. Остальные методы возвращают значение NO.
Поиск объектов
Категория NSSet(SCSet) реализует следующие методы поиска объкетов протокола SCCollection:
- (BOOL)containsAnyObjectFromCollection:(
id<
SCCollection>)collection;
Преобразование неупорядоченных множеств
Категория декларирует и реализует свойства и методы преобразования неупорядоченных множеств в коллекции другого типа из поддерживаемых библиотекой:
@property (nonatomic, retain, readonly, getter=array)
SCArray *array;
@property (nonatomic, retain, readonly, getter=set)
SCSet *set;
@property (nonatomic, retain, readonly, getter=orderedSet)
SCOrderedSet *orderedSet;
@property (nonatomic, retain, readonly, getter=dictionary)
SCDictionary *dictionary;
@property (nonatomic, retain, readonly, getter=stack)
SCStack *stack;
@property (nonatomic, retain, readonly, getter=queue)
SCQueue *queue;
@property (nonatomic, retain, readonly, getter=unidirectionalList)
SCUnidirectionalList *unidirectionalList;
@property (nonatomic, retain, readonly, getter=bidirectionalList)
SCBidirectionalList *bidirectionalList;
@property (nonatomic, retain, readonly, getter=foundationArray) NSArray *foundationArray;
@property (nonatomic, retain, readonly, getter=foundationSet) NSSet *foundationSet;
@property (nonatomic, retain, readonly, getter=foundationOrderedSet) NSOrderedSet *foundationOrderedSet;
@property (nonatomic, retain, readonly, getter=foundationDictionary) NSDictionary *foundationDictionary;
- (NSArray *)foundationArray;
- (NSSet *)foundationSet;
- (NSOrderedSet *)foundationOrderedSet;
- (NSDictionary *)foundationDictionary;
Расширение класса NSMutableSet
Категория NSMutableSet(SCMutableSet) расширяет функциональные возможности класса NSMutableSet (изменяемые неупорядоченные множества) через реализацию протокола SCMutableCollection.
Копирование неупорядоченных множеств
Категория реализует следующие методы копирования неупорядоченных множеств протокола SCMutableCollection:
Добавление элементов
Категория NSMutableSet(SCMutableSet) реализует следующие методы добавления объектов в неупорядоченные множества из протокола SCMutableCollection:
Удаление элементов
Категория декларирует следующие методы удаления объектов:
- (void)removeObjectsWithClass:(Class)oclass;
- (void)removeObjectsWithClassName:(NSString *)name;
Расширение класса NSOrderedSet
Категория NSOrderedSet(SCOrderedSet) дополняет возможности упорядоченного множества методами и свойствами протоколов SCCollection и SCIndexedCollection.
Создание упорядоченных множеств
Категория объявляет следующие классовые методы для создания упорядоченных множеств с использованием данных из последовательных файлов, словарей и потоков:
+ (instancetype)orderedSetWithCoder:(NSCoder *)coder;
+ (instancetype)orderedSetWithContentsOfSerializedFile:(NSString *)path;
+ (instancetype)orderedSetWithDataDictionary:(NSDictionary *)dictionary;
+ (instancetype)orderedSetWithDataDictionaryFromFile:(NSString *)path;
+ (instancetype)orderedSetWithStream:(
SCStream *)stream;
+ (instancetype)orderedSetWithFileStream:(NSString *)path;
Также категория реализует следующие методы создания экземпляров классов:
+ (instancetype)orderedSetWithCollection:(
id<
SCCollection>)collection;
- Классовый метод orderedSetWithCollection: создает упорядоченное множество с элементами из указанной коллекции любого поддерживаемого библиотекой типа.
Инициализация упорядоченных множеств
- (instancetype)initWithCollection:(
id<
SCCollection>)collection;
- Метод initWithCollection: инициализирует упорядоченное множество с объектами из заданной коллекции любого поддерживаемого библиотекой типа.
Реализация протокола SCCollection
Категория NSOrderedSet(SCOrderedSet) декларирует следующие свойства и методы протокола SCCollection:
@property (nonatomic, assign, readonly, getter=empty) BOOL empty;
@property (nonatomic, assign, readonly, getter=readOnly) BOOL readOnly;
- (BOOL)empty;
- (BOOL)readOnly;
- Свойство empty возвращает значение YES для пустого упорядоченного множества и NO для упорядоченного множества, в котором есть хотя бы один объект.
- Свойство readOnly определяет возможность внесения изменений в упорядоченное множество. Для класса NSOrderedSet свойство всегда возращает значение YES, а для класса-потомка NSMutableOrderedSet всегда возвращает значение NO.
Следующие методы категории NSOrderedSet(SCOrderedSet) и протокола SCCollection определяют тип коллекции, к которой относится экземпляр класса:
- (BOOL)isCollection;
- (BOOL)isLibraryCollection;
- (BOOL)isFoundationCollection;
- (BOOL)isArray;
- (BOOL)isLibraryArray;
- (BOOL)isFoundationArray;
- (BOOL)isSet;
- (BOOL)isLibrarySet;
- (BOOL)isFoundationSet;
- (BOOL)isOrderedSet;
- (BOOL)isLibraryOrderedSet;
- (BOOL)isFoundationOrderedSet;
- (BOOL)isDictionary;
- (BOOL)isLibraryDictionary;
- (BOOL)isFoundationDictionary;
- (BOOL)isStack;
- (BOOL)isQueue;
- (BOOL)isList;
- (BOOL)isSortable;
Значение YES возвращают методы isCollection, isFoundationCollection, isOrderedSet и isFoundationOrderedSet.
Поиск объектов
Категория NSOrderedSet(SCOrderedSet) реализует следующие методы протокола SCCollection:
- (BOOL)containsAnyObjectFromCollection:(
id<
SCCollection>)collection;
Преобразование упорядоченных множеств
Категория NSOrderedSet(SCOrderedSet) осуществляет реализацию методов конвертации между различными поддерживаемыми библиотекой типами коллекций протокола SCCollection:
@property (nonatomic, retain, readonly, getter=array)
SCArray *array;
@property (nonatomic, retain, readonly, getter=set)
SCSet *set;
@property (nonatomic, retain, readonly, getter=orderedSet)
SCOrderedSet *orderedSet;
@property (nonatomic, retain, readonly, getter=dictionary)
SCDictionary *dictionary;
@property (nonatomic, retain, readonly, getter=stack)
SCStack *stack;
@property (nonatomic, retain, readonly, getter=queue)
SCQueue *queue;
@property (nonatomic, retain, readonly, getter=unidirectionalList)
SCUnidirectionalList *unidirectionalList;
@property (nonatomic, retain, readonly, getter=bidirectionalList)
SCBidirectionalList *bidirectionalList;
@property (nonatomic, retain, readonly, getter=foundationArray) NSArray *foundationArray;
@property (nonatomic, retain, readonly, getter=foundationSet) NSSet *foundationSet;
@property (nonatomic, retain, readonly, getter=foundationOrderedSet) NSOrderedSet *foundationOrderedSet;
@property (nonatomic, retain, readonly, getter=foundationDictionary) NSDictionary *foundationDictionary;
- (NSArray *)foundationArray;
- (NSSet *)foundationSet;
- (NSOrderedSet *)foundationOrderedSet;
- (NSDictionary *)foundationDictionary;
Сортировка упорядоченных множеств
Категория NSOrderedSet(SCOrderedSet) определяет методы, возвращающие отсортированные упорядоченные множества:
@property (nonatomic, retain, readonly, getter=sortedOrderedSet) NSOrderedSet *sortedOrderedSet;
- (NSOrderedSet *)ascendingSortedOrderedSetWithSorter:(
id<
SCSorter>)sorter;
- (NSOrderedSet *)descendingSortedOrderedSetWithSorter:(
id<
SCSorter>)sorter;
- (NSOrderedSet *)sortedOrderedSetWithSorter:(
id<
SCSorter>)sorter;
- (NSOrderedSet *)ascendingSortedOrderedSet;
- (NSOrderedSet *)descendingSortedOrderedSet;
- (NSOrderedSet *)sortedOrderedSet;
Также категория декларирует классовые методы и методы инициализации упорядоченных множеств с отсортированными данными из существующих коллекций любого поддерживаемого библиотекой типа:
+ (instancetype)orderedSetWithAscendingSortedCollection:(
id<
SCCollection>)collection sorter:(
id<
SCSorter>)sorter;
+ (instancetype)orderedSetWithDescendingSortedCollection:(
id<
SCCollection>)collection sorter:(
id<
SCSorter>)sorter;
+ (instancetype)orderedSetWithSortedCollection:(
id<
SCCollection>)collection sorter:(
id<
SCSorter>)sorter;
+ (instancetype)orderedSetWithAscendingSortedCollection:(
id<
SCCollection>)collection;
+ (instancetype)orderedSetWithDescendingSortedCollection:(
id<
SCCollection>)collection;
+ (instancetype)orderedSetWithSortedCollection:(
id<
SCCollection>)collection;
- (instancetype)initWithAscendingSortedCollection:(
id<
SCCollection>)collection sorter:(
id<
SCSorter>)sorter;
- (instancetype)initWithDescendingSortedCollection:(
id<
SCCollection>)collection sorter:(
id<
SCSorter>)sorter;
- (instancetype)initWithAscendingSortedCollection:(
id<
SCCollection>)collection;
- (instancetype)initWithDescendingSortedCollection:(
id<
SCCollection>)collection;
- (instancetype)initWithSortedCollection:(
id<
SCCollection>)collection;
Дополнительные методы
Категория NSOrderedSet(SCOrderedSet) также реализует следующие методы, которые мы затрудняемся отнести к той или иной группе:
@property (nonatomic, retain, readonly, getter=allObjects) NSArray* allObjects;
- Метод allObjects возвращает массив со всеми элементами упорядоченного множества. Из-за особенностей хранения объектов этот метод аналогичен свойству foundationArray.
Расширение класса NSMutableOrderedSet
Категория NSMutableOrderedSet(SCMutableOrderedSet) дополняет стандартный класс изменяемых упорядоченных множеств функциональностью протоколов SCMutableCollection и SCMutableIndexedCollection.
Копирование упорядоченных множеств
Для реализации методов копирования коллекций протокола SCMutableCollection категория NSMutableOrderedSet(SCMutableOrderedSet) реализует эти методы в классе NSMutableOrderedSet:
- Метод setCollection: удаляет из упорядоченного множества содержащиеся в нем элементы и вместо них добавляет объекты из указанной коллекции любого поддерживаемого библиотекой типа.
- Метод setObject: заменяет текущие элементы упорядоченного множества заданным объектом.
- Метод setObjects: удаляет все текущие элементы упорядоченного множества и добавляет объекты из заданного завершаемого нулевым указателем списка.
Добавление элементов
Реализация функций добавления объектов протокола SCMutableCollection заключается в объявлении категорией NSMutableOrderedSet(SCMutableOrderedSet) следующих методов:
- Метод addObjects: добавляет в упорядоченное множество объекты из заданного завершаемого нулевым указателем списка.
- С помощью метода addCollection: осуществляется добавление в упорядоченное множество объектов из заданной коллекции любого поддерживаемого библиотекой типа.
Удаление элементов
Категория реализует следующие методы удаления объектов протокола SCMutableCollection:
- (void)removeObjectsWithClass:(Class)oclass;
- (void)removeObjectsWithClassName:(NSString *)name;
- Метод removeObjectsWithClass: удаляет из упорядоченного множества все объекты указанного класса.
- Метод removeObjectsWithClassName: удаляет все объекты класса с заданным названием из упорядоченного множества.
- Метод removeCollection: осуществляет удаление из упорядоченного множества объектов, входящих в указанную коллекцию любого поддерживаемого библиотекой типа.
- Метод removeObjects: выполняет удаление из упорядоченного множества объектов из заданного завершаемого нулевым указателем списка.
Замена элементов
Категория NSMutableOrderedSet(SCMutableOrderedSet) реализует следующие методы замены элементов упорядоченного множества:
- (void)replaceObjectsAtIndexes:(NSIndexSet *)indexes withCollection:(
id<
SCCollection>)collection;
- Метод replaceObjectsAtIndexes:withCollection: заменяет объекты упорядоченного множества по указанным индексам на объекты из заданной коллекции любого поддерживаемого библиотекой типа.
Сортировка упорядоченных множеств
Сортировка объектов упорядоченного множества осуществляется следующими методами категории:
- (void)sortAscendingWithSorter:(
id<
SCSorter>)sorter;
- (void)sortDescendingWithSorter:(
id<
SCSorter>)sorter;
- (void)sortWithSorter:(
id<
SCSorter>)sorter;
- (void)sortAscending;
- (void)sortDescending;
- (void)sort;
Дополнительно в категории реализованы методы, которые замещают текущее содержимое упорядоченного множества на отсортированное содержимое заданной коллекции любого поддерживаемого библиотекой типа:
- (void)setAscendingSortedCollection:(
id<
SCCollection>)collection;
- (void)setDescendingSortedCollection:(
id<
SCCollection>)collection;
Дополнительные методы
Кроме вышепечисленных методов категория NSMutableOrderedSet(SCMutableOrderedSet) реализует методы, которые мы не можем отнести к конкретной категории методов:
- (void)moveObjectAtIndex:(
SCIndex)index toIndex:(
SCIndex)destination;
- Метод moveObjectAtIndex:toIndex: перемещает объект с заданным индексом в указанную позицию.
Расширение класса NSDictionary
Категория NSDictionary(SCDictionary) расширяет стандартную функциональность класса NSDictionary путем добавления в него поддержки протокола SCCollection. Данные расширения не только добавляют стандартному классу дополнительные возможности, но и делают словари совместимыми с различными механизмами нашей библиотеки.
Создание словарей
Категория объявляет следующие методы создания словарей с использованием данных из последовательных файлов, словарей и потоков:
+ (instancetype)dictionaryWithCoder:(NSCoder *)coder;
+ (instancetype)dictionaryWithContentsOfSerializedFile:(NSString *)path;
+ (instancetype)dictionaryWithDataDictionary:(NSDictionary *)dictionary;
+ (instancetype)dictionaryWithDataDictionaryFromFile:(NSString *)path;
+ (instancetype)dictionaryWithStream:(
SCStream *)stream;
+ (instancetype)dictionaryWithFileStream:(NSString *)path;
Категория декларирует следующие методы создания словарей:
+ (instancetype)dictionaryWithCollection:(
id<
SCCollection>)collection;
- Классовый метод dictionaryWithCollection: создает словарь на основании объектов из существующей коллекции любого поддерживаемого библиотекой типа. Если в качестве аргумента метода передана коллекция, отличная от словаря, генерация ключей для добавляемых объектов производится автоматически.
NSDictionary *dictionary = [NSDictionary dictionaryWithCollection:source];
NSLog( @"%@", dictionary);
2016-09-19 16:33:51.614 libtest[1167:87256] {
"Key 0" = 000;
"Key 1" = 100;
"Key 2" = 200;
}
Инициализация словарей
Категория NSDictionary(SCDictionary) объявляет следующие методы инициализации экземпляров класса:
- (instancetype)initWithCollection:(
id<
SCCollection>)collection;
- Метод initWithCollection: инициализирует экземпляр класса с объектами из указанной коллекции любого поддерживаемого библиотекой типа.
Реализация протокола SCCollection
Для реализации ряда методов протокола SCCollection категория объявляет следующие свойства и методы:
@property (nonatomic, assign, readonly, getter=empty) BOOL empty;
@property (nonatomic, assign, readonly, getter=readOnly) BOOL readOnly;
- (BOOL)empty;
- (BOOL)readOnly;
- Свойство empty возвращает значение NO при наличии в словаре хотя бы одной записи и YES для пустого словаря.
- Свойство readOnly позволяет определить, могут ли вноситься в словарь изменения. Обращаем внимание, что для экземпляров класса NSDictionary всегда возвращается значение YES, а для экземпляров класса NSMutableDictionary значение NO.
Также категория реализует методы, позволяющие определить тип коллекции программным путем:
- (BOOL)isCollection;
- (BOOL)isLibraryCollection;
- (BOOL)isFoundationCollection;
- (BOOL)isArray;
- (BOOL)isLibraryArray;
- (BOOL)isFoundationArray;
- (BOOL)isSet;
- (BOOL)isLibrarySet;
- (BOOL)isFoundationSet;
- (BOOL)isOrderedSet;
- (BOOL)isLibraryOrderedSet;
- (BOOL)isFoundationOrderedSet;
- (BOOL)isDictionary;
- (BOOL)isLibraryDictionary;
- (BOOL)isFoundationDictionary;
- (BOOL)isStack;
- (BOOL)isQueue;
- (BOOL)isList;
- (BOOL)isSortable;
Для экземпляров классов NSDictionary и NSMutableDictionary значение YES возвращают методы isCollection, isFoundationCollection, isDictionary и isFoundationDictionary. Остальные методы возвращают значение NO.
Поиск объектов
Категория декларирует следующие методы поиска объектов протокола SCCollection:
- (BOOL)containsAnyObjectFromCollection:(
id<
SCCollection>)collection;
- Метод containsObject: определяет наличие в словаре указанного объекта.
- Метод containsObjects: проверяет наличие в словаре всех объектов из заданного завершаемого нулевым указателем списка.
- Метод containsCollection: возвращает значение YES, если словарь содержит все объекты из указанной коллекции любого поддерживаемого библиотекой списка.
- Метод containsAnyObject: определяет наличие в словаре хотя бы одного объекта из указанного завершаемого нулевым указателем списка.
- Метод containsAnyObjectFromCollection: проверяет наличие в словаре как минимум одного объекта из заданной коллекции любого поддерживаемого библиотекой типа.
Преобразование словарей
Преобразование словарей в другие виды коллекций выполняют следующие свойства и методы категории:
@property (nonatomic, retain, readonly, getter=array)
SCArray *array;
@property (nonatomic, retain, readonly, getter=set)
SCSet *set;
@property (nonatomic, retain, readonly, getter=orderedSet)
SCOrderedSet *orderedSet;
@property (nonatomic, retain, readonly, getter=dictionary)
SCDictionary *dictionary;
@property (nonatomic, retain, readonly, getter=stack)
SCStack *stack;
@property (nonatomic, retain, readonly, getter=queue)
SCQueue *queue;
@property (nonatomic, retain, readonly, getter=unidirectionalList)
SCUnidirectionalList *unidirectionalList;
@property (nonatomic, retain, readonly, getter=bidirectionalList)
SCBidirectionalList *bidirectionalList;
@property (nonatomic, retain, readonly, getter=foundationArray) NSArray *foundationArray;
@property (nonatomic, retain, readonly, getter=foundationSet) NSSet *foundationSet;
@property (nonatomic, retain, readonly, getter=foundationOrderedSet) NSOrderedSet *foundationOrderedSet;
@property (nonatomic, retain, readonly, getter=foundationDictionary) NSDictionary *foundationDictionary;
- (NSArray *)foundationArray;
- (NSSet *)foundationSet;
- (NSOrderedSet *)foundationOrderedSet;
- (NSDictionary *)foundationDictionary;
Расширение класса NSMutableDictionary
Категория NSMutableDictionary(SCMutableDictionary) дополняет класс NSMutableDictionary функциональными возможностями протокола SCMutableCollection.
Копирование словарей
Категория реализует следующие методы протокола SCMutableCollection:
- Метод setCollection: заменяет текущее содержимое словаря объектами из указанной коллекции любого поддерживаемого библиотекой типа с автоматической генерацией ключей (если исходная коллекция не является словарем).
- Метод setObject: удаляет текущее содержимое словаря и добавляет в него указанный объект.
- Метод setObjects: заменяет содержимое словаря объектами из указанного завершаемого нулевым указателем списка с автоматической генерацией ключей.
Добавление элементов
Категория реализует следующие методы протокола SCMutableCollection для удаления объектов из словаря. При работе данных методов ключи к новым объектам генерируются автоматически (кроме ряда случаев с методом addCollection:).
- Метод addObject: добавляет в словарь указанный объект.
- С помощью метода addObjects: в словарь добавляются объекты из завершаемого нулевым указателем списка.
- Метод addCollection: добавляет в словарь объекты из указанной коллекции любого поддерживаемого библиотекой типа. Если в качестве аргумента методу передан словарь, то ключи к объектам берутся исходные, в противном случае ключи генерируются автоматически.
Удаление элементов
Для удаления объектов категория NSMutableDictionary(SCMutableDictionary) реализует следующие методы протокола SCMutableCollection:
- (void)removeObjectsWithClass:(Class)oclass;
- (void)removeObjectsWithClassName:(NSString *)name;
Расширение класса NSData
Как и категории NSNull(SCNull) и NSDate(SCDate), категория NSData(SCData) расширяет функциональность класса NSData методами для создания экземпляров класса с использованием данных из последовательных файлов, словарей и потоков:
+ (instancetype)dataWithCoder:(NSCoder *)coder;
+ (instancetype)dataWithContentsOfSerializedFile:(NSString *)path;
+ (instancetype)dataWithDataDictionary:(NSDictionary *)dictionary;
+ (instancetype)dataWithDataDictionaryFromFile:(NSString *)path;
+ (instancetype)dataWithStream:(
SCStream *)stream;
+ (instancetype)dataWithFileStream:(NSString *)path;
Классы и категории macOS
- Предупреждения
- Описанные в данном разделе классы и категории поддерживаются только в операционной системе macOS и ограниченно на платформе GNUstep.
К данным компонентам библиотеки относятся следующие классы и категории:
Категория NSButton(SCButton)
Категория NSButton(SCButton) добавляет в стандартный класс NSButton следующее свойство:
@property (nonatomic, getter=stateWithBool, setter=setStateWithBool:) BOOL boolState;
Данное свойство позволяет переключать состояние интерфейсной кнопки с помощью логического значения:
- присвоение свойству значения YES переводит интерфейсную кнопку в состояние NSOnState
- значение NO переводит интерфейсную кнопку в состояние NSOffState
Категория NSAlert(SCAlert)
Стандартный класс NSAlert предоставляет программистам интерфейс для отображения панелей с различными сообщениями и возможностями выбора действий со стороны пользователя. Пример панели в виде запроса на подтверждение удаления данных Вы видите на следующем рисунке:
Несмотря на свои возможности, класс NSAlert для работы с ним требует от программистов задания значительного числа параметров, что делает данный класс не самым удобным в использовании. Именно для решения данной проблемы мы и разработали наше собственное расширение в виде категории NSAlert(SCAlert). Данный раздел документации подробно рассматривает наши дополнения к классу:
Виды панелей
Операционная система macOS определяет следующие виды панелей:
NSAlertStyleCritical - панель с критической информацией, например с сообщением об ошибке
NSAlertStyleWarning - преждупреждающая панель, выводящая информацию средней степени важности
NSAlertStyleInformational - информационная панель, предназначенная для вывода простого сообщения
Создание и инициализация панелей
Для создания панели общего вида категория объявляет следующий метод:
+ (instancetype)alertWithStyle:(NSAlertStyle)style
message:(NSString *)message
text:(NSString *)text
buttons:(NSString *)button, ... NS_REQUIRES_NIL_TERMINATION;
Метод возвращает указатель на панель с заданными стилем, текстом сообщения, информационным текстом и списком кнопок. Для отображения вышеприведенного примера панели можно использовать следующий код:
NSAlert *alert = [NSAlert criticalAlertWithMessage:@"Confirm the deleting of the selected user:"
text:@"John Smith"
buttons:@"Yes", @"No", @"Help", nil];
[alert runModal];
Приведем описание остальных методов создания панелей:
+ (instancetype)criticalAlertWithMessage:(NSString *)message
text:(NSString *)text
buttons:(NSString *)button, ... NS_REQUIRES_NIL_TERMINATION;
+ (instancetype)criticalAlertWithMessage:(NSString *)message text:(NSString *)text button:(NSString *)button;
+ (instancetype)criticalAlertWithMessage:(NSString *)message text:(NSString *)text;
+ (instancetype)warningAlertWithMessage:(NSString *)message
text:(NSString *)text
buttons:(NSString *)button, ... NS_REQUIRES_NIL_TERMINATION;
+ (instancetype)warningAlertWithMessage:(NSString *)message text:(NSString *)text button:(NSString *)button;
+ (instancetype)warningAlertWithMessage:(NSString *)message text:(NSString *)text;
+ (instancetype)alertWithMessage:(NSString *)message
text:(NSString *)text
buttons:(NSString *)button, ... NS_REQUIRES_NIL_TERMINATION;
+ (instancetype)alertWithMessage:(NSString *)message text:(NSString *)text button:(NSString *)button;
+ (instancetype)alertWithMessage:(NSString *)message text:(NSString *)text;
- Метод criticalAlertWithMessage:text:buttons: создает панель критической информации с использованием заданных текста сообщения, информационного текста и списка кнопок, завершаемого нулевым указателем.
- Метод criticalAlertWithMessage:text:button: возвращает панель критической информации, которая была создана с применением указанных текста сообщения, информационного текста и заголовка единственной кнопки создаваемой панели.
- Метод criticalAlertWithMessage:text: обеспечивает создание панели критической информации с заданными текстом сообщения, информационным текстом и кнопкой закрытия панели по умолчанию (кнопка "OK").
- Метод warningAlertWithMessage:text:buttons: возвращает предупреждающую панель, которая содержит заданные текст сообщения, информационный текст и завершаемый нулевым указателем список кнопок.
- Метод warningAlertWithMessage:text:button: создает предупреждающую панель с использованием указанных текста сообщения, информационного текста и заголовка единственной кнопки.
- Метод warningAlertWithMessage:text: обеспечивает создание предупреждающей панели с заданными текстом сообщения, информационным текстом и кнопкой закрытия панели по умолчанию (кнопка "OK").
- Метод alertWithMessage:text:buttons: создает информационную панель с применением указанных текста сообщения, информационного текста и списка кнопок, завершаемого нулевым указателем.
- Метод alertWithMessage:text:button: обеспечивает создание информационной панели с указанными текстом сообщения, информационным текстом и заголовком единственной кнопки.
- Метод alertWithMessage:text: возвращает информационную панель с заданными текстом сообщения, информационным текстом и заголовком кнопки закрытия панели по умолчанию (кнопка "OK").
Также категория NSAlert(SCAlert) объявляет следующие методы инициализации различных видов панелей:
- (instancetype)initWithStyle:(NSAlertStyle)style
message:(NSString *)message
text:(NSString *)text
buttons:(NSString *)button, ... NS_REQUIRES_NIL_TERMINATION;
- (instancetype)initCriticalAlertWithMessage:(NSString *)message
text:(NSString *)text
buttons:(NSString *)button, ... NS_REQUIRES_NIL_TERMINATION;
- (instancetype)initCriticalAlertWithMessage:(NSString *)message text:(NSString *)text button:(NSString *)button;
- (instancetype)initCriticalAlertWithMessage:(NSString *)message text:(NSString *)text;
- (instancetype)initWarningAlertWithMessage:(NSString *)message
text:(NSString *)text
buttons:(NSString *)button, ... NS_REQUIRES_NIL_TERMINATION;
- (instancetype)initWarningAlertWithMessage:(NSString *)message text:(NSString *)text button:(NSString *)button;
- (instancetype)initWarningAlertWithMessage:(NSString *)message text:(NSString *)text;
- (instancetype)initWithMessage:(NSString *)message
text:(NSString *)text
buttons:(NSString *)button, ... NS_REQUIRES_NIL_TERMINATION;
- (instancetype)initWithMessage:(NSString *)message text:(NSString *)text button:(NSString *)button;
- (instancetype)initWithMessage:(NSString *)message text:(NSString *)text;
Отображение панелей
Созданные панели можно вывести на экран с помощью метода NSAlert::runModal, однако категория NSAlert(SCAlert) декларирует ряд методов, которые выполняют следующие действия:
- создают панель с заданными параметрами
- выводят созданную панель на экран
- возвращают код нажатой пользователем кнопки
Данные методы объявлены в категории NSAlert(SCAlert) следующим образом:
+ (NSInteger)runAlertWithStyle:(NSAlertStyle)style
message:(NSString *)message
text:(NSString *)text
buttons:(NSString *)button, ... NS_REQUIRES_NIL_TERMINATION;
+ (NSInteger)runCriticalAlertWithMessage:(NSString *)message
text:(NSString *)text
buttons:(NSString *)button, ... NS_REQUIRES_NIL_TERMINATION;
+ (NSInteger)runCriticalAlertWithMessage:(NSString *)message text:(NSString *)text button:(NSString *)button;
+ (NSInteger)runCriticalAlertWithMessage:(NSString *)message text:(NSString *)text;
+ (NSInteger)runWarningAlertWithMessage:(NSString *)message
text:(NSString *)text
buttons:(NSString *)button, ... NS_REQUIRES_NIL_TERMINATION;
+ (NSInteger)runWarningAlertWithMessage:(NSString *)message text:(NSString *)text button:(NSString *)button;
+ (NSInteger)runWarningAlertWithMessage:(NSString *)message text:(NSString *)text;
+ (NSInteger)runAlertWithMessage:(NSString *)message
text:(NSString *)text
buttons:(NSString *)button, ... NS_REQUIRES_NIL_TERMINATION;
+ (NSInteger)runAlertWithMessage:(NSString *)message text:(NSString *)text button:(NSString *)button;
+ (NSInteger)runAlertWithMessage:(NSString *)message text:(NSString *)text;
Подробная информация о возвращаемых этими методами кодах нажатых пользователем кнопках приведена в разделе Кнопки панелей данного руководства.
Запрос подтверждений
В предыдущем разделе мы рассмотрели методы, выводящие на экран созданные панели. В большинстве случае вывод панелей используется для выполнения одного из следующих действий:
- информирование пользователей о наступлении тех или иных событий
- предоставление пользователям возможности выбора дальнейшего алгоритма работы приложения
Ранее рассмотренные методы могут использоваться для решения обеих этих задач. В то же время во втором случае чаще всего мы ждем от пользователя выбора одного из двух вариантов - делать или не делать то или иное действие, например, удалять или не удалять какую-либо запись в базе данных.
Чтобы в данных простых случаях не добавлять в приложение проверку кода выбранной пользователем кнопки мы создали в категории NSAlert(SCAlert) ряд методов запроса подтверждений, основным из которых является метод:
+ (BOOL)confirmAlertWithStyle:(NSAlertStyle)style
message:(NSString *)message
text:(NSString *)text
confirm:(NSInteger)confirm
buttons:(NSString *)button, ... NS_REQUIRES_NIL_TERMINATION;
Данный метод создает и выводит на экран панель указанного стиля с заданными текстом сообщения, информационным текстом и списком заголовков кнопок. После того, как пользователь нажмет одну из кнопок, метод выполняет сравнение кода этой кнопки с кодом, который задан параметром confirm. Если коды совпадают, то метод возвращает значение YES, в противном случае возвращаетс значение NO.
Также категория NSAlert(SCAlert) объявляет следующие дополнительные методы запроса подтверждений:
+ (BOOL)confirmCriticalAlertWithMessage:(NSString *)message
text:(NSString *)text
confirm:(NSInteger)confirm
buttons:(NSString *)button, ... NS_REQUIRES_NIL_TERMINATION;
+ (BOOL)confirmCriticalAlertWithMessage:(NSString *)message
text:(NSString *)text
buttons:(NSString *)button, ... NS_REQUIRES_NIL_TERMINATION;
+ (BOOL)confirmWarningAlertWithMessage:(NSString *)message
text:(NSString *)text
confirm:(NSInteger)confirm
buttons:(NSString *)button, ... NS_REQUIRES_NIL_TERMINATION;
+ (BOOL)confirmWarningAlertWithMessage:(NSString *)message
text:(NSString *)text
buttons:(NSString *)button, ... NS_REQUIRES_NIL_TERMINATION;
+ (BOOL)confirmAlertWithMessage:(NSString *)message
text:(NSString *)text
confirm:(NSInteger)confirm
buttons:(NSString *)button, ... NS_REQUIRES_NIL_TERMINATION;
+ (BOOL)confirmAlertWithMessage:(NSString *)message
text:(NSString *)text
buttons:(NSString *)button, ... NS_REQUIRES_NIL_TERMINATION;
Обращаем Ваше внимание, что если метод не имеет параметра confirm, это означает, что в качестве подтверждающей кнопки используется первая из добавленых. Подробнее о работе с кнопками и их кодами Вы можете прочитать в следующем разделе.
Дополнительно категория NSAlert(SCAlert) реализует ряд простых методов для запроса подтверждений:
+ (BOOL)confirmYesNoAlertWithMessage:(NSString *)message text:(NSString *)text;
+ (BOOL)confirmNoYesAlertWithMessage:(NSString *)message text:(NSString *)text;
+ (BOOL)confirmOKCancelAlertWithMessage:(NSString *)message text:(NSString *)text;
+ (BOOL)confirmCancelOKAlertWithMessage:(NSString *)message text:(NSString *)text;
- Метод confirmYesNoAlertWithMessage:text: выводит панель с указанными текстом сообщения, информационным текстом и кнопками "Да" и "Нет" и возвращает значение YES если пользователь нажал кнопку "Да". При этом кнопка "Да" в выводимой панели является кнопкой выбора по умолчанию - срабатывает при нажатии на клавиатуре клавиши "Ввод".
- Метод confirmNoYesAlertWithMessage:text: действует аналогично предыдущему методу, однако кнопкой по умолчанию панели является кнопка "Нет".
- Методы confirmOKCancelAlertWithMessage:text: и confirmCancelOKAlertWithMessage:text: аналогичны предыдущим двум методам, однако вместо кнопок "Да" и "Нет" используют кнопки "OK" и "Отмена".
Кнопки панелей
Класс NSAlert предоставляет метод addButtonWithTitle:, который добавляет в существующую панель новую кнопку слева от ранее добавленных. По такому же алгоритму действуют и методы категории NSAlert(SCAlert), позволяющие указать несколько кнопок - первая кнопка в списке выводится самой правой, следующая за ней слева и так далее.
Метод NSAlert::runModal возвращает код выбранной пользователем кнопки, который вычисляется по формуле 1000 + id, где параметр id обозначает порядковый номер кнопки справа налево, начиная с нуля. То есть, самая правая кнопка имеет код возврата 1000, кнопка слева от нее код 1001 и так далее.
Для класса NSAlert определены следующие константы кнопок, которые Вы можете использовать в своих программах:
NSAlertFirstButtonReturn = 1000
NSAlertSecondButtonReturn = 1001
NSAlertThirdButtonReturn = 1002
Однако вы можете использовать свои собственные константы как для первых трех кнопок, так и для всех остальных, которые Вы будете при необходимости добавлять в Ваши панели.
Исключительные ситуации
Для эффективной обработки возможных ошибок библиотека использует классы исключительных ситуаций, общим предком которых является класс SCException (дочерний класс NSException). Данный раздел руководства программиста подробно рассказывает как об общих моментах всех классов исключительных ситуаций библиотеки, так и об особенностях ошибок тех или иных механизмов библиотеки.
Иерархия классов исключительных ситуаций
Класс SCException
Класс SCException является общим предком всех классов исключительных ситуаций нашей библиотеки. Он не только создает иерархию классов, но и определяет для остальных классов такие понятия и средства, как коды и идентификаторы ошибок.
Коды и идентификаторы ошибок
Каждая ошибка в библиотеке имеет свои собственные код и идентификатор.
Код ошибки - отрицательное число, начиная от значения -20000 и ниже. Такой выбор связан с кодами ошибок, которые СУБД ORACLE выделяет для пользовательских ошибок. Собственно сама система формирования кодов и идентификаторов ошибок взята нами из ORACLE.
Для получения идентификатора ошибки используется свойство code:
@property (assign, readonly, getter=code)
SCInteger code;
@try {
NSLog( @"%@", array);
}
NSLog( @"%@", [error description]);
NSLog( @"========================================================================");
NSLog(
@"Error code: %d", error.
code);
NSLog( @"========================================================================");
}
2016-09-21 13:11:00.173 libtest[3362:472990] SCL-20041: Source collection is nil
2016-09-21 13:11:00.174 libtest[3362:472990] ========================================================================
2016-09-21 13:11:00.174 libtest[3362:472990] Error code: -20041
2016-09-21 13:11:00.174 libtest[3362:472990] ========================================================================
Идентификатором ошибки мы называем строку, которая обычно содержит три символа и текстовое представление кода ошибки. Для непосредственно ошибок библиотеки мы используем символы SCL. Чтобы получить идентификатор ошибки, необходимо воспользоваться свойством eid:
@property (retain, readonly, getter=eid) NSString *eid;
@try {
[array addObject:nil];
NSLog( @"%@", array);
}
NSLog( @"%@", [error description]);
NSLog( @"========================================================================");
NSLog(
@"Error ID: %@", error.
eid);
NSLog( @"========================================================================");
}
2016-09-21 14:04:41.375 libtest[3803:499118] SCL-20044: Array - empty item adding attemption
2016-09-21 14:04:41.375 libtest[3803:499118] ========================================================================
2016-09-21 14:04:41.375 libtest[3803:499118] Error ID: SCL-20044
2016-09-21 14:04:41.375 libtest[3803:499118] ========================================================================
Инициализация исключительных ситуаций
Класс SCException объявляет следующие методы инициализации исключительных ситуаций:
- (instancetype)initWithName:(NSString *)name reason:(NSString *)reason code:(
SCInteger)code eid:(NSString *)eid;
- Метод initWithName:reason:code:eid: является основным инициализатором исключительных ситуаций библиотеки. Он позволяет инициализировать исключительную ситуацию с заданными названием, описанием ошибки, кодом и идентификатором ошибки. Рекомендуется использовать этот инициализатор для реализации Ваших собственных исключительных ситуаций, если нет необходимости создавать дочерний класс.
@try {
reason:@"Unspecified error"
code:-30000
eid:@"SCL-3000"] autorelease];
@throw exception;
}
NSLog( @"%@", [error description]);
NSLog( @"========================================================================");
NSLog(
@"Error Code: %d", error.
code);
NSLog(
@"Error ID: %@", error.
eid);
NSLog( @"========================================================================");
}
2016-09-21 15:26:21.203 libtest[3982:536145] Unspecified error
2016-09-21 15:26:21.203 libtest[3982:536145] ========================================================================
2016-09-21 15:26:21.203 libtest[3982:536145] Error Code: -30000
2016-09-21 15:26:21.203 libtest[3982:536145] Error ID: SCL-3000
2016-09-21 15:26:21.203 libtest[3982:536145] ========================================================================
Класс SCAbstractMethodException
Класс SCAbstractMethodException создан специально для ситуаций, когда происходит попытка вызова абстрактного метода. Поскольку в Objective C такого понятия, как абстрактный метод нет, то приходится создавать реализацию такого метода с вызовом исключительной ситуации SCL-20001.
Класс объявляет следующие свойства и методы для доступа к данным исключительной ситуации:
@property (nonatomic, retain, readonly, getter=methodName) NSString *methodName;
- (NSString *)methodName;
- Свойство methodName возвращает имя вызванного абстрактного метода.
Для создания экземпляра класса с указанием названия абстрактного метода применяется следующий классовый метод:
+ (instancetype)exceptionWithMethod:(NSString *)method;
Класс SCSystemException
Класс исключительной ситуации SCSystemException предназначен для обработки ошибок, которые возникают при использовании системных вызовов или библиотек, использующих системные вызовы. Все системные ошибки идентифицируются библиотекой под идентификатором SCL-20002.
Класс декларирует следующие свойства и методы, обеспечивающие доступ к информации об обрабатываемой системной ошибке:
@property (nonatomic, assign, readonly, getter=error)
SCSystemError error;
@property (nonatomic, retain, readonly, getter=objectName) NSString *objectName;
- (NSString *)objectName;
- Свойство error возвращает системный идентификатор возникшей ошибки.
- Свойство objectName возвращает имя объекта, вызвавшего системную ошибку. В зависимости от типа ошибки это может быть имя файла или какие-либо иные данные.
Для создания экземпляров класса в его интерфейсе декларированы следующие классовые методы:
+ (instancetype)exceptionWithError:(
SCSystemError)error object:(NSString *)object;
- Классовый метод exceptionWithError:object: создает исключительную ситуацию с указанными системным идентификатором ошибки и именем вызвавшего ее объекта.
- Классовый метод exceptionWithError: создает исключительную ситуацию с заданным системным идентификатором ошибки и пустым объектом (для ситуаций, когда ошибка не связана с конкретным объектом).
Класс SCNumberException
Класс SCNumberException реализует понятие ошибки числового объекта, которая может возникнуть при работе с методами расширяющей класс NSNumber категории NSNumber(SCNumber). В классе определены следующие идентификаторы ошибок:
- SCL-20010 - неопределенная ошибка числового объекта (не используется в коде библиотеки)
- SCL-20011 - неподдерживаемый тип числового объекта
Выполнить инициализацию ошибки числового объекта с заданными описанием, кодом и идентификатором можно с помощью следующего метода класса SCNumberException:
- (instancetype)initWithReason:(NSString *)reason code:(
SCInteger)code eid:(NSString *)eid;
Неопределенная ошибка числового объекта
Ошибка SCL-20010 не используется библиотекой, однако ее можно использовать в тех случаях, когда необходимо обозначить ошибку числового объекта, но не вводить новый идентификатор ошибки.
Для создания и инициализации неопределенной ошибки числового объекта можно использовать следующие методы класса:
+ (instancetype)exception;
- Классовый метод exception создает общую исключительную ситуацию числового объекта с сообщением об ошибке по умолчанию.
Неподдерживаемый тип числового объекта
Ошибка SCL-20011 генерируется при обнаружении числового объекта неподдерживаемого библитекой типа. При этом в ходе обработки данной ошибки можно использовать следующие свойства и методы:
@property (retain, readonly, getter=unsupportedType) NSString *unsupportedType;
- (NSString *)unsupportedType;
Для создания исключительной ситуации неподдерживаемого типа числового объекта применяются методы:
+ (instancetype)exceptionWithUnsupportedType:(NSString *)type;
Класс SCStreamException
Класс исключительной ситуации SCStreamException обеспечивает обработку ошибок механизма потоков (кроме ошибок файловых потоков, которые обрабатывает класс исключительной ситуации SCFileStreamException).
Свойства исключительной ситуации
Класс SCStreamException декларирует следующие свойства и методы доступа к ним:
@property (nonatomic, retain, readonly, getter=streamName) NSString *streamName;
@property (retain, readonly, getter=unknown) NSString *unknown;
@property (nonatomic, retain, readonly, getter=unexpected) NSString *unexpected;
@property (nonatomic, retain, readonly, getter=expected) NSString *expected;
@property (retain, readonly, getter=unsupported) NSString *unsupported;
@property (nonatomic, assign, readonly, getter=readedBytes)
SCUInteger readedBytes;
@property (nonatomic, assign, readonly, getter=writedBytes)
SCUInteger writedBytes;
@property (nonatomic, assign, readonly, getter=waitedBytes)
SCUInteger waitedBytes;
@property (nonatomic, assign, readonly, getter=openError)
SCInteger openError;
@property (nonatomic, assign, readonly, getter=readError)
SCInteger readError;
@property (nonatomic, assign, readonly, getter=writeError)
SCInteger writeError;
@property (assign, readonly, getter=numberType) NSString *numberType;
- (NSString *)streamName;
- (NSString *)unknown;
- (NSString *)unexpected;
- (NSString *)expected;
- (NSString *)unsupported;
- (NSString *)numberType;
- Свойство streamName содержит название потока, вызвавшего исключительную ситуацию. Данное свойство может быть нулевым, если ошибку вызвал неименованный поток.
- Свойство unknown возвращает имя обнаруженного при чтении данных из потока класса, который неизвестен системе. Значение в данное свойство записывается при обработке ошибки SCL-20024.
- Свойство unexpected содержат имя класса, который при работе с потоком встретился вместо ожидаемого класса, имя которого хранится в свойстве expected. Данные свойства используются при обработке ошибки SCL-20025.
- Свойство unsupported хранит название обнаруженного в потоке класса, который известен системе, но не соответствует протоколу SCStreaming. Эти данные используются при обработке ошибки SCL-20026.
- Свойство readedBytes содержит количество реально прочитанных из потока байт. В сочетании со свойством waitedBytes оно применяются в обработке ошибки SCL-20027.
- Свойство openError содержит код ошибки, обнаруженной при попытке открытия потока. Данные формируются при обработке ошибки SCL-20029.
- Свойство readError хранит код ошибки чтения данных из потока, формируемый в ходе обработке ошибки SCL-20030.
- Свойство writeError содержит код ошибки записи информации в поток, который формируется при обработке ошибки SCL-20031.
- Свойство numberType позволяет определить неподдерживаемый кодом библиотеки тип числового объекта при работе с ними потоков. Запись данного типа формируется при обработке ошибки SCL-20032.
SCL-20020: неопределенная ошибка потока
Данная ошибка может быть использована в тех случаях, когда обрабатывается ситуация, не подходящая под существующие идентификаторы ошибок потоков, но создание нового идентификатора нецелесообразно.
При этом класс SCStreamException позволяет создать исключительную ситуацию с возможностью задать нестандартные коды и идентификаторы ошибки:
+ (instancetype)exceptionWithStream:(NSString *)stream
reason:(NSString *)reason
eid:(NSString *)eid;
+ (instancetype)exceptionWithReason:(NSString *)reason code:(
SCInteger)code eid:(NSString *)eid;
- Классовый метод exceptionWithStream:reason:code:eid: создает исключительную ситуацию с указанными названием потока, описанием ошибки, кодом ошибки и идентификатором ошибки.
- Классовый метод exceptionWithReason:code:eid: действует аналогично предыдущему методу, однако не задает имя потока, то есть предназначен для генерации исключительной ситуации, вызванной неименованным потоком.
SCL-20021: поток не открыт
Данная ошибка возникает при попытке совершения операции чтения или записи с неоткрытым потоком.
Для создания данной исключительной ситуации используются классовые методы:
+ (instancetype)exceptionWithNotOpenStream:(NSString *)stream;
+ (instancetype)exceptionWithNotOpen;
SCL-20022: поток открыт только для чтения
Исключительная ситуация возникает при попытке записать данные в поток, который открыт только для чтения.
Для создания данной исключительной ситуации класс SCStreamException декларирует следующие классовые методы:
+ (instancetype)exceptionWithReadOnlyStream:(NSString *)stream;
+ (instancetype)exceptionWithReadOnly;
SCL-20023: поток открыт только для записи
Данная ошибка генерируется механизмом потоков при попытке чтения данных из открытого только для записи потока.
Создание данной исключительной ситуации возможно через использование следующих классовых методов
+ (instancetype)exceptionWithReadOnlyStream:(NSString *)stream;
+ (instancetype)exceptionWithReadOnly;
SCL-20024: обнаружен неизвестный класс
Ошибка возникает в том случае, когда при чтении из потока экземпляра класса обнаруживается, что такой класс неизвестен системе. Обычно это происходит при попытке чтения потока более старой версией программного обеспечения, чем версия ПО, с помощью которого были записаны в поток данные.
Получить название неизвестного класса можно через свойство unknown:
@property (retain, readonly, getter=unknown) NSString *unknown;
Для создания экземпляров данной исключительной ситуации предназначены следующие классовые методы:
+ (instancetype)exceptionWithUnknown:(NSString *)name stream:(NSString *)stream;
+ (instancetype)exceptionWithUnknown:(NSString *)name;
SCL-20025: обнаружен экземпляр класса неожиданного типа
Если поток вместо экземпляра одного класса обнаруживает данные экземпляра другого класса, то выполняется генерация данной исключительной ситуации.
Название обнаруженного и ожидавшегося класса определяются с помощью следующих свойств и методов класса:
@property (nonatomic, retain, readonly, getter=unexpected) NSString *unexpected;
@property (nonatomic, retain, readonly, getter=expected) NSString *expected;
- (NSString *)unexpected;
- (NSString *)expected;
Для создания данной исключительной ситуации предназначены следующие классовые методы:
+ (instancetype)exceptionWithUnexpected:(NSString *)unexpected expected:(NSString *)expected stream:(NSString *)stream;
+ (instancetype)exceptionWithUnexpected:(NSString *)unexpected expected:(NSString *)expected;
SCL-20026: обнаружен неподдерживаемый класс
При загрузке данных экземпляра класса может обнаружиться, что данный класс не соответствует протоколу SCStreaming.
Название такого класса можно выяснить через свойство и метод класса SCStreamException:
@property (retain, readonly, getter=unsupported) NSString *unsupported;
- (NSString *)unsupported;
Для создания исключительной ситуации могут быть использованы следующие классовые методы:
+ (instancetype)exceptionWithUnsupported:(NSString *)name stream:(NSString *)stream;
+ (instancetype)exceptionWithUnsupported:(NSString *)name;
SCL-20027: операция чтения не завершена
Ошибка возникает в том случае, если из потока было загружено меньше символов, чем было запрошено.
Данные о том, сколько символов было прочитано, а сколько запрошено, можно получить с помощью следующих свойств и методов:
@property (nonatomic, assign, readonly, getter=readedBytes)
SCSize readedBytes;
@property (nonatomic, assign, readonly, getter=waitedBytes)
SCSize waitedBytes;
Создание экземпляров данной исключительной ситуации обеспечивается следующими классовыми методами:
+ (instancetype)exceptionWithReaded:(
SCSize)readed waited:(
SCSize)waited stream:(NSString *)stream;
+ (instancetype)exceptionWithReaded:(
SCSize)readed waited:(
SCSize)waited;
SCL-20028: операция записи не завершена
Данная ошибка обычно генерируется механизмом потоков в тех случаях, когда был зафиксирован факт того, что в поток было записано меньше символов, чем требовалось. Такое может произойти при попытке записи в файл на файловой системе, на которой закончилось место или при записи в закрывшийся из-за сбоя сетевой поток.
Информация о реально записанных и подлежащих записи символах можно прочитать через свойства и методы класса:
@property (nonatomic, assign, readonly, getter=writedBytes)
SCSize writedBytes;
@property (nonatomic, assign, readonly, getter=waitedBytes)
SCSize waitedBytes;
Для создания экземпляров данной исключительной ситуации предназначены следующие классовые методы:
+ (instancetype)exceptionWithWrited:(
SCUInteger)writed waited:(
SCUInteger)waited stream:(NSString *)stream;
SCL-20029: ошибка открытия потока
Исключительная ситуация генерируется механизмом потоков при ошибке открытия потока. В качестве основного параметра ошибки выступает код ошибки, который возвращается после неудачного выполнения системного метода или вызова кода используемой в работе потока библиотеки:
@property (nonatomic, assign, readonly, getter=openError)
SCInteger openError;
Создать данную исключительную ситуацию можно с помощью следующих методов класса SCStreamException:
+ (instancetype)exceptionWithOpenError:(
SCInteger)error stream:(NSString *)stream;
+ (instancetype)exceptionWithOpenError:(
SCInteger)error;
SCL-20030: ошибка чтения данных
Ошибка возникает, если в ходе операции чтения данных из потока системный или библиотечный вызов возвращают ошибку чтения данных (например при попытке считать файл с поврежденного носителя или при возникновении сбоев в работе сети). При обнаружении ошибки идентифицирующий ее системный или библиотечный код записывается в свойство readError:
@property (nonatomic, assign, readonly, getter=readError)
SCInteger readError;
За создание данной исключительной ситуации отвечают следующие методы класса SCStreamException:
+ (instancetype)exceptionWithReadError:(
SCInteger)error stream:(NSString *)stream;
+ (instancetype)exceptionWithReadError:(
SCInteger)error;
SCL-20031: ошибка записи данных
Исключительная ситуация предназначена для обработки ошибок в ходе операций записи данных в поток. Информация в виде полученного от системного или библиотечного вызова кода ошибки сохраняется в свойстве writeError:
@property (nonatomic, assign, readonly, getter=writeError)
SCInteger writeError;
Для создания экземпляра данной исключительной ситуации класс SCStreamException декларирует следующие классовые методы:
+ (instancetype)exceptionWithWriteError:(
SCInteger)error stream:(NSString *)stream;
+ (instancetype)exceptionWithWriteError:(
SCInteger)error;
SCL-20032: ошибка класса NSNumber
Исключительная ситуация возникает при обнаружении механизмом потоков неизвестного ей типа числового объекта NSNumber. Данные о встреченном типе NSNumber хранится в свойстве numberType:
@property (assign, readonly, getter=numberType) NSString *numberType;
- (NSString *)numberType;
Создание данной исключительной ситуации обеспечивают следующие методы класса SCStreamException:
+ (instancetype)exceptionWithUnsupportedNumberType:(NSString *)type stream:(NSString *)stream;
+ (instancetype)exceptionWithUnsupportedNumberType:(NSString *)type;
Класс SCFileStreamException
Класс исключительной ситуации SCFileStreamException расширяет возможности родительского класса SCStreamException, дополняя их для поддержки файловых потоков на базе класса SCFileStream.
Свойства исключительной ситуации
Класс SCFileStreamException определяет следующие свойства и методы доступа к ним:
@property (assign, readonly, getter=seekError)
SCSystemError seekError;
@property (assign, readonly, getter=offset)
SCLong offset;
- Свойство openMode возвращает некорректный режим, обнаруженный механизмом потоков при попытке открыть файловый поток. Данное свойство используется при обработке ошибки SCL-20033.
- Свойство seekError содержат информацию о системной ошибке, обнаруженной при попытке позиционирования в потоке. Используются при обработке исключительных ситуаций SCL-20036 и SCL-20037.
- Свойство offset хранит данные о некорректном значении смещения при попытке позиционирования в файловом потоке. Эти данные применяются при обработке ошибки SCL-20036.
- Свойство whence возвращает обнаруженное при попытке позиционирования в файловом потоке ошибочное значение направления смещения. Свойство применяется в ходе обработки исключительных ситуаций SCL-20036 и SCL-20037.
SCL-20033: некорректный режим открытия файла потока
Класс SCFileStream поддерживает определенный набор режимов открытий файловых потоков. При попытке открыть поток с иным режимом генерируется данная исключительная ситуация. Какой именно некорректный режим был передан экземпляру класса, позволяет определить свойство openMode экземпляра класса SCFileStreamException:
Создать экземпляр данной исключительной ситуации можно с помощью следующих методов класса SCFileStreamException:
SCL-20034: пустой путь к файлу потока
Данная ошибка фиксируется при попытке открыть файл потока с нулевым путем к нему. Обычно такая ситуация возникает, когда программное обеспечение передает механизму потоков полученный от пользователя путь к файлу без его проверки или же в результате ошибок в самом использующем потоки программном обеспечении.
Создать данную исключительную ситуацию можно путем использования следующих классовых методов:
+ (instancetype)exceptionWithEmptyPath;
SCL-20035: обнаружен конец потока
Ошибка генерируется при попытке считать данные из файлового потока после того, как был достигнут его конец, то есть прочитаны все имевшиеся в потоке данные. Для создания экземпляра данной исключительной ситуации класс SCFileStreamException декларирует следующие классовые методы:
+ (instancetype)exceptionWithEndOfFile:(NSString *)file;
+ (instancetype)exceptionWithEndOfFile;
SCL-20036: некорректное смещение в потоке
Ошибка возникает при попытке позиционировать указатель за пределы потока.
Для работы с данной ошибкой класс SCFileStreamException определяет следующие свойства и методы:
@property (assign, readonly, getter=seekError)
SCSystemError seekError;
@property (assign, readonly, getter=offset)
SCLong offset;
Для создания экземпляров данной исключительной ситуации в классе SCFileStreamException объявлены следующие классовые методы:
offset:(NSInteger)offset
path:(NSString *)path;
offset:(NSInteger)offset;
+ (instancetype)exceptionWithSeekError:(
SCSystemError)error path:(NSString *)path;
SCL-20037: некорректное направление смещения в потоке
Данная ошибка происходит при обнаружении некорректного направления смещения указателя в файловом потоке. Данные по этой исключительной ситуации определяются через следующие свойства и методы класса SCFileStreamException:
@property (assign, readonly, getter=seekError)
SCSystemError seekError;
Создание экземпляров данной исключительной ситуации обеспечивается следующими классовыми методами, объявленными в классе SCFileStreamException:
Класс SCCollectionException
Класс исключительной ситуации SCCollectionException обеспечивает обработку ошибок, которые могут возникнуть при работе с коллекциями библиотеки.
Свойства исключительной ситуации
Для доступа к различным данным о той или иной исключительной ситуации, которая может быть сгенерирована в ходе работы механизма коллекций, класс SCCollectionException декларирует ряд свойств и методов для доступа к данным свойствам. Все свойства доступны только для чтения.
@property (nonatomic, retain, readonly, getter=collectionName) NSString *collectionName;
@property (nonatomic, retain, readonly, getter=typeName) NSString *typeName;
@property (nonatomic, retain, readonly, getter=unsupported) NSString *unsupported;
@property (nonatomic, retain, readonly, getter=unknown) NSString *unknown;
@property (nonatomic, retain, readonly, getter=unexpected) NSString *unexpected;
@property (nonatomic, retain, readonly, getter=expected) NSString *expected;
@property (nonatomic, assign, readonly, getter=index)
SCIndex index;
@property (nonatomic, assign, readonly, getter=range) NSRange range;
@property (nonatomic, retain, readonly, getter=indexSet) NSIndexSet *indexSet;
@property (nonatomic, assign, readonly, getter=indexesCount)
SCULong indexesCount;
@property (nonatomic, assign, readonly, getter=objectsCount)
SCULong objectsCount;
@property (nonatomic, retain, readonly, getter=key) NSString *key;
@property (nonatomic, assign, readonly, getter=keysCount)
SCULong keysCount;
- (NSString *)collectionName;
- (NSString *)typeName;
- (NSString *)unsupported;
- (NSString *)unknown;
- (NSString *)unexpected;
- (NSString *)expected;
- (NSRange)range;
- (NSIndexSet *)indexSet;
- (NSString *)key;
- Свойство collectionName хранит название коллекции, вызвавшей исключительную ситуацию. Значение данного свойства заполняется при любых ошибках механизма коллекций. Если вызвавшая ошибку коллекция является неименованной, то данное свойство будет возвращать нулевой указатель.
- Свойство typeName возвращает имя класса объекта, переданного механизму коллекций как указатель на коллекцию. Значение данного свойства используется при обработке исключительной ситуации SCL-20042.
- Для определения названия класса, не соответствующего протоколу SCCollectioning, но обнаруженному среди объектов коллекции, обработчик ошибки SCL-20046 формирует значение свойства unsupported.
- Свойство unknown хранит имя неизвестного системе класса, который был встречен при обработке объектов коллекции. Эти данные в экземпляр класса SCCollectionException формируются при обработке ошибки SCL-20047.
- Свойство index хранит некорректный индекс объекта коллекции, формируемый при обработке исключительной ситуации SCL-20052.
- Свойство range позволяет определить некорректный диапазон объектов, вызвавший исключительную ситуацию SCL-20053.
- Через свойство indexSet предоставляется доступ к указателю на множество индексов, использование которого привело к возникновению ошибки SCL-20054.
- Свойство indexesCount содержит некорректное количество индексов, зафиксированное при обработке исключительной ситуации SCL-20055.
- Обнаруженный при обработке исключительных ситуаций SCL-20056 и SCL-20058 некорректный ключ объекта в словаре содержится в свойстве key.
- Некорректное количество ключей объектов в словаре при обработке ошибки SCL-20057 становится доступным через свойство keysCount.
SCL-20040 - неопределенная ошибка коллекции
Ошибка SCL-20040 предназначена для обозначения ошибок коллекции, которые не относятся к уже определенным конкретным исключительным ситуациям. Данный идентификатор введен нами для тех случаев, когда ко всему прочему нет необходимости создавать исключительную ситуацию с отдельным идентификатором.
Для создания исключительных ситуаций с возможностью задать определенные (в том числе и собственные) коды и идентификаторы ошибок могут использоваться следующие методы класса SCCollectionException:
+ (instancetype)exceptionWithName:(NSString *)name reason:(NSString *)reason code:(
SCInteger)code eid:(NSString *)eid;
+ (instancetype)exceptionWithReason:(NSString *)reason code:(
SCInteger)code eid:(NSString *)eid;
SCL-20041 - исходная коллекция не существует
Исключительная ситуация генерируется при обнаружении, что в ходе создания коллекции или замены ее содержимого, исходная коллекция не существует - вместо указателя на нее соответствующему методу был передан нулевой указатель.
Для создания данной исключительной ситуации класс SCCollectionException декларирует следующие методы:
+ (instancetype)exceptionWithSource;
SCL-20042 - неподдерживаемый тип коллекции
Исключительная ситуация генерируется если вместе указателя на коллекцию какому-либо методу передается указатель на экземпляр класса другого типа, например, вместо указателя на массив будет передан указатель на строку.
Название класса переданного экземпляра содержится в свойстве typeName:
@property (nonatomic, retain, readonly, getter=typeName) NSString *typeName;
Создание экземпляра данной исключительной ситуации обеспечивается следующими методами класса SCCollectionException:
+ (instancetype)exceptionWithUnsupportedType:(NSString *)type;
SCL-20043 - нарушение режима «только для чтения»
Исключительная ситуация SCL-20043 генерируется при попытке внести изменения в коллекцию, находящуюся в режиме "только для чтения".
Класс SCCollectionException декларирует следующие классовые методы для создания данной исключительной ситуации:
+ (instancetype)exceptionWithReadOnlyType:(NSString *)type name:(NSString *)name;
+ (instancetype)exceptionWithReadOnlyType:(NSString *)type;
Обращаем внимание, что параметр type данных методов (а также ряда других) передает методу название типа коллекции, вызвавшей исключительную ситуацию для правильной генерации сообщения об ошибке.
SCL-20044 - добавление нулевого указателя
Ошибка возникает при попытке добавить в коллекцию нулевой указатель. Для создания данной исключительной ситуации применяются следующие методы класса SCCollectionException:
+ (instancetype)exceptionWithItemType:(NSString *)type name:(NSString *)name;
+ (instancetype)exceptionWithItemType:(NSString *)type;
SCL-20045 - исходный объект не существует
Данная исключительная ситуация генерируется в том случае, когда вместо указателя на необходимый для выполнения операции объект передан нулевой указатель.
Создание исключительной ситуации SCL-20045 выполняется следующими методами класса SCCollectionException:
+ (instancetype)exceptionWithObject;
SCL-20046 - неподдерживаемый класс
Если в ходе работы механизма коллекций обнаруживается экземпляр класса, который не соответствует протоколу SCCollectioning, генерируется исключительная ситуация, которая фиксирует название этого класса в свойстве unsupported:
@property (nonatomic, retain, readonly, getter=unsupported) NSString *unsupported;
- (NSString *)unsupported;
Класс SCCollectionException для создания данной исключительной ситуации декларирует следующие классовые методы:
+ (instancetype)exceptionWithUnsupported:(NSString *)cname type:(NSString *)type name:(NSString *)name;
+ (instancetype)exceptionWithUnsupported:(NSString *)cname type:(NSString *)type;
SCL-20047 - неизвестный класс
Когда коллекция в ходе обработки объектов обнаруживает экземпляр класса, который неизвестен системе, генерируется исключительная ситуация SCL-20047, а название такого класса сохраняется в свойстве SCCollectionException. unknown "unknown":
@property (nonatomic, retain, readonly, getter=unknown) NSString *unknown;
Создание экземпляров данной исключительной ситуации осуществляется с помощью следующих классовых методов:
+ (instancetype)exceptionWithUnknown:(NSString *)cname type:(NSString *)type name:(NSString *)name;
+ (instancetype)exceptionWithUnknown:(NSString *)cname type:(NSString *)type;
SCL-20048 - объект коллекции не поддерживает сравнивание
Исключительная ситуация генерируется в ходе выполнения сортировки содержимого коллекции при обнаружении в ней объектов, которые не могут сравниваться между собой. Для создания экземпляра данной исключительной ситуации класс SCCollectionException реализует следующие классовые методы:
+ (instancetype)exceptionWithNotComparableType:(NSString *)type name:(NSString *)name;
+ (instancetype)exceptionWithNotComparableType:(NSString *)type;
SCL-20049 - коллекция не поддерживает операции сортировки
Ошибка возникает при попытке отсортировать коллекцию, которая не поддерживает операции по сортировке своих объектов. За создание экземпляра данной исключительной ситуации отвечают следующие методы класса SCCollectionException:
+ (instancetype)exceptionWithNotSortableType:(NSString *)type name:(NSString *)name;
+ (instancetype)exceptionWithNotSortableType:(NSString *)type;
SCL-20050 - некорректный сортировщик данных
Данная исключительная ситуация возникает при попытке выполнить сортировку данных в коллекции с использованием некорректного сортировщика данных. Создание экземпляров данной исключительной ситуации обеспечивают следующие методы класса SCCollectionException:
+ (instancetype)exceptionWithSorterType:(NSString *)type name:(NSString *)name;
+ (instancetype)exceptionWithSorterType:(NSString *)type;
SCL-20052 - некорректный индекс объекта
Если индексируемой коллекции передан индекс, выходящий за ее пределы, генерируется исключительная ситуация SCL-20052, которая хранит обнаруженный ошибочный индекс в свойстве index:
@property (nonatomic, assign, readonly, getter=index)
SCIndex index;
Создать экземпляр данной исключительной ситуации можно с помощью следующих классовых методов:
+ (instancetype)exceptionWithIndex:(
SCIndex)index name:(NSString *)name;
+ (instancetype)exceptionWithIndex:(
SCIndex)index;
SCL-20053 - некорректный диапазон объектов
При обнаружении факта передачи какому-либо методу коллекции некорректного диапазона объектов генерируется исключительная ситуация SCL-20053. Ошибочный диапазон объектов при этом записывается в свойство range:
@property (nonatomic, assign, readonly, getter=range) NSRange range;
Создание экземпляра данной исключительной ситуации обеспечивается следующими методами класса SCCollectionException:
+ (instancetype)exceptionWithRange:(NSRange)range name:(NSString *)name;
+ (instancetype)exceptionWithRange:(NSRange)range;
SCL-20054 - некорректный список индексов
Если индексированная коллекция обнаруживает передачу ее методу некорректного множества индексов (пустой указатель на множество или множество, содержащее некорректный индекс), генерируется исключительная ситуация SCL-20054. Вызвавшее ошибку множество индексов доступно через свойство indexSet:
@property (nonatomic, retain, readonly, getter=indexSet) NSIndexSet *indexSet;
- (NSIndexSet *)indexSet;
Для создания экземпляров данной исключительной ситуации класс SCCollectionException декларирует следующие классовые методы:
+ (instancetype)exceptionWithIndexSet:(NSIndexSet *)indexSet name:(NSString *)name;
+ (instancetype)exceptionWithIndexSet:(NSIndexSet *)indexSet;
SCL-20055 - несоответствие количества индексов и объектов
Ряд методов индексируемых коллекций оперирует с множествами индексов и списками объектов. При этом количество индексов должно совпадать с количеством объектов. Если коллекция обнаруживает несоответствие между ними, генерируется исключительная ситуация SCL-20055. Сведения об ошибке хранятся в следующих свойствах:
@property (nonatomic, assign, readonly, getter=indexesCount)
SCULong indexesCount;
@property (nonatomic, assign, readonly, getter=objectsCount)
SCULong objectsCount;
- Свойство indexesCount содержит количество индексов во множестве индексов.
Создание данной исключительной ситуации обеспечивают следующие методы класса SCCollectionException:
+ (instancetype)exceptionWithIndexesCount:(
SCULong)indexes objectsCount:(
SCULong)objects;
SCL-20056 - ошибка ключа объекта
Если коллекция обнаруживает передачу ей некорректного ключа к объекту (обычно применяются в словарях), то возникает ошибка SCL-20056. Ошибочный ключ хранится в свойстве SCCollectionException.key "key" экземпляра данной исключительной ситуации:
@property (nonatomic, retain, readonly, getter=key) NSString *key;
Класс SCCollectionException декларирует следующие методы создания экземпляров данной исключительной ситуации:
+ (instancetype)exceptionWithKey:(NSString *)key name:(NSString *)name;
+ (instancetype)exceptionWithKey:(NSString *)key;
SCL-20057 - несоответствие ключей и объектов
Данная ошибка аналогична исключительной ситуации SCL-20055, только вместо количества индексов используется количество ключей. Данные об ошибке хранятся в следующих свойствах экземпляра исключительной ситуации:
@property (nonatomic, assign, readonly, getter=keysCount)
SCULong keysCount;
@property (nonatomic, assign, readonly, getter=objectsCount)
SCULong objectsCount;
Создание экземпляров данной исключительной ситуации обеспечивают следующие методы класса SCCollectionException:
+ (instancetype)exceptionWithKeysCount:(
SCULong)keys objectsCount:(
SCULong)objects;
SCL-20058 - пустое значение
Данная исключительная ситуация возникает при попытке назначить ключу пустое значение. Ошибочный ключ хранится в свойстве key:
@property (nonatomic, retain, readonly, getter=key) NSString *key;
Следующие методы класса SCCollectionException обеспечивают создание экземпляра данной исключительной ситуации:
+ (instancetype)exceptionValueForKey:(NSString *)key name:(NSString *)name;
+ (instancetype)exceptionValueForKey:(NSString *)key;
Класс SCTextException
Класс исключительной ситуации SCTextException обеспечивает обработку ошибок, которые могут возникнуть при работе механизма текстов библиотеки, а именно классов:
Свойства исключительной ситуации
Класс SCTextException объявляет ряд доступных только для чтения свойств и методов доступа к этим свойствам:
@property (nonatomic, retain, readonly, getter=textName) NSString *textName;
@property (nonatomic, retain, readonly, getter=string) NSString *string;
@property (nonatomic, assign, readonly, getter=index)
SCIndex index;
@property (nonatomic, retain, readonly, getter=indexSet) NSIndexSet *indexSet;
@property (nonatomic, retain, readonly, getter=unsupported) NSString *unsupported;
@property (nonatomic, assign, readonly, getter=indexesCount)
SCULong indexesCount;
@property (nonatomic, assign, readonly, getter=stringsCount)
SCULong stringsCount;
@property (nonatomic, assign, readonly, getter=range) NSRange range;
@property (nonatomic, assign, readonly, getter=intersected) NSRange intersected;
@property (nonatomic, assign, readonly, getter=stream)
SCStream *stream;
- (NSString *)textName;
- (NSString *)string;
- (NSIndexSet *)indexSet;
- (NSString *)unsupported;
- (NSRange)range;
- (NSRange)intersected;
- Свойство textName возвращает имя текстового объекта, при работе с которым возникла исключительная ситуация. Если ошибка возникла в неименованном текстовом объекте, то свойство textName возвращает нулевой указатель. Данное свойство формируется при обработке любой исключительной ситуации текстового объекта.
- Свойство index хранит информацию об индексе, который либо вызвал ошибку некорректного индекса SCL-20072, либо связан с исключительной ситуацией нарушения уникальности строк SCL-20069.
- Обнаруженный при обработке исключительной ситуации SCL-20074 некорректный список индексов строк хранится в свойстве indexSet.
- Свойство unsupported сохраняет название неподдерживаемого класса, экземпляр которого был обнаружен во время обработки исключительной ситуации SCL-20066.
- Свойство indexesCount после обработки ошибки SCL-20075 содержит количество индексов, которое не совпало с количеством строк, которое может быть определено через свойство stringsCount.
- Свойство range возвращает диапазон строк, вызвавший исключительную ситуацию некорректного диапазона строк SCL-20073, а также один из пересекающихся диапазонов строк в исключительной ситуации SCL-20076.
- Свойство intersected хранит обнаруженный при обработке исключительной ситуации пересекающегося диапазона SCL-20076 второго из пересекающихся диапазонов строк.
SCL-20060 - неопределенная ошибка текстовых классов
Кроме определенных видов исключительных ситуаций класс SCTextException позволяет создавать исключительные ситуации с дополнительными идентификаторами ошибок, а также исключительную ситуацию неопределенной ошибки текстовых классов SCL-20060:
+ (instancetype)exceptionWithName:(NSString *)name reason:(NSString *)reason code:(
SCInteger)code eid:(NSString *)eid;
+ (instancetype)exceptionWithReason:(NSString *)reason code:(
SCInteger)code eid:(NSString *)eid;
+ (instancetype)exceptionWithName:(NSString *)name;
+ (instancetype)exception;
- Классовый метод exceptionWithName:reason:code:eid: создает исключительную ситуацию для текстового объекта с указанным именем и заданными описанием, кодом и идентификатором ошибки.
- Классовый метод exceptionWithReason:code:eid: позволяет создать исключительную ситуацию с заданными описанием, кодом и идентификатором ошибки для неименованного текстового объекта.
- Классовый метод exception возвращает созданную общую исключительную ситуацию для неименованного текстового объекта.
SCL-20061 - исходный объект не существует
Исключительная ситуация генерируется при попытке обработать данные, вместо которых соответствующему методу был передан нулевой указатель. Для создания экземпляра данной исключительной ситуации класс SCTextException реализует следующие классовые методы:
+ (instancetype)sourceExceptionWithName:(NSString *)name;
+ (instancetype)sourceException;
SCL-20062 - некорректный входной поток
Если при попытке загрузки текстового файла из потока будет обнаружена проблема с входным потоком (нулевой указатель на поток, поток не поддерживает операций чтения), текстовый объект генерирует исключительную ситуацию SCL-20062. Указатель на некорректный входной поток доступен через свойство stream:
@property (nonatomic, assign, readonly, getter=stream)
SCStream *stream;
За создание экземпляров данной исключительной ситуации отвечают следующие методы класса SCTextException:
+ (instancetype)exceptionWithInputStream:(
SCStream *)stream name:(NSString *)name;
+ (instancetype)exceptionWithInputStream:(
SCStream *)stream;
SCL-20063 - нарушение режима «только для чтения»
Исключительная ситуация SCL-20063 генерируется при попытке внести изменения в текстовый режим, находящийся в режиме "только для чтения". Создание экземпляров данной исключительной ситуации осуществляется следующими методами класса SCTextException:
+ (instancetype)readOnlyExceptionWithName:(NSString *)name;
+ (instancetype)readOnlyException;
SCL-20064 - добавление нулевой строки
Ошибка SCL-20064 возникает при попытке добавить в текстовый объект нулевую строку, то есть когда текстовому объекту вместо указателя на строку передается нулевой указатель. Класс SCTextException декларирует следующие методы создания экземпляров данной исключительной ситуации:
+ (instancetype)emptyStringExceptionWithName:(NSString *)name;
+ (instancetype)emptyStringException;
SCL-20065 - работа с закрытым потоком
Данная исключительная ситуация генерируется при попытке осуществить операцию чтения или записи данных при работе с закрытым потоком. Указатель на данный поток хранится в свойстве stream экземпляра класса:
@property (nonatomic, assign, readonly, getter=stream)
SCStream *stream;
Создание экземпляров данной исключительной ситуации осуществляется следующими методами класса SCTextException:
+ (instancetype)exceptionWithClosedStream:(
SCStream *)stream name:(NSString *)name;
+ (instancetype)exceptionWithClosedStream:(
SCStream *)stream;
SCL-20066 - обнаружен неподдерживаемый класс
Если текстовый объект при обработке данных обнаруживает неподдерживаемый им класс, генерируется исключительная ситуация SCL-20066. Имя неподдерживаемого класса сохраняется в свойстве unsupported:
@property (nonatomic, retain, readonly, getter=unsupported) NSString *unsupported;
- (NSString *)unsupported;
Для создания экземпляров данной исключительной ситуации класс SCTextException декларирует следующие классовые методы:
+ (instancetype)exceptionWithUnsupported:(NSString *)unsupported name:(NSString *)name;
+ (instancetype)exceptionWithUnsupported:(NSString *)unsupported;
SCL-20067 - ошибка чтения данных из потока
Если в ходе загрузки строк из потока возникает ошибка чтения данных, то текстовый объект генерирует исключительную ситуацию SCL-20067, сохраняя в свойстве stream указатель на вызвавший ошибку поток:
@property (nonatomic, assign, readonly, getter=stream)
SCStream *stream;
Чтобы создать экземпляр данной исключительной ситуации, необходимо использовать один из следующих методов класса SCTextException:
+ (instancetype)readErrorExceptionWithStream:(
SCStream *)stream name:(NSString *)name;
+ (instancetype)readErrorExceptionWithStream:(
SCStream *)stream;
SCL-20068 - пустой путь к текстовому файлу
Данная ошибка возникает при передаче классу SCTextFile пустого указателя на путь к файлу или указателя на пустую строку в качестве пути к текстовому файлу. За создание экземпляров исключительной ситуации в классе SCTextException отвечают следующие классовые методы:
+ (instancetype)emptyPathExceptionWithName:(NSString *)name;
+ (instancetype)emptyPathException;
SCL-20069 - нарушение уникальности строк
Данная исключительная ситуация генерируется классом SCUniqueStrings при обнаружении нарушения уникальности строк, то есть при возникновении ситуации, когда в список добавляется строка, которая в нем уже присутствует. Для обработки данной ошибки класс SCTextException использует следующие свойства и методы:
@property (nonatomic, retain, readonly, getter=string) NSString *string;
@property (nonatomic, assign, readonly, getter=index)
SCIndex index;
- Свойство string содержит строку, которая вызвала исключительную ситуацию.
- Свойство index обеспечивает доступ к индексу, по которому находится строка, попытка дублирования которой была обнаружена текстовым объектом.
Для создания экземпляров данной исключительной ситуации могут быть использованы классовые методы, которые реализует класс SCTextException:
+ (instancetype)duplicateExceptionWithName:(NSString *)name string:(NSString *)string index:(
SCIndex)index;
+ (instancetype)duplicateExceptionWithString:(NSString *)string index:(
SCIndex)index;
SCL-20070 - некорректный сортировщик строк
Если текстовый объект обнаруживает переданный ему некорректный сортировщик строк, генерируется исключительная ситуация SCL-20070, для создания которой класс SCTextException реализует следующие методы:
+ (instancetype)sorterExceptionWithName:(NSString *)name;
+ (instancetype)sorterException;
SCL-20071 - некорректный выходной поток
Если текстовый файл при попытке записи данных обнаруживает нулевой указатель на выходной поток, определяет, что указанный поток не поддерживает операций записи или по иным причинам не может осуществлять запись, генерируется исключительная ситуация SCL-20071. Указатель на вызвавший ошибку поток можно получить из метода stream:
@property (nonatomic, assign, readonly, getter=stream)
SCStream *stream;
Создать экземпляр данной исключительной ситуации позволяют следующие классовые методы:
+ (instancetype)exceptionWithOutputStream:(
SCStream *)stream name:(NSString *)name;
+ (instancetype)exceptionWithOutputStream:(
SCStream *)stream;
SCL-20072 - недопустимый индекс
Исключительная ситуация генерируется при попытке доступа к строке с некорректным индексом, номер которого можно выяснить из свойства index:
@property (nonatomic, assign, readonly, getter=index)
SCIndex index;
Для создания экземпляра исключительной ситуации могут использоваться следующие классовые методы:
+ (instancetype)exceptionWithIndex:(
SCIndex)index name:(NSString *)name;
+ (instancetype)exceptionWithIndex:(
SCIndex)index;
SCL-20073 - недопустимый диапазон строк
При обнаружении некорректного диапазона строк текстовый объект генерирует исключительную ситуацию SCL-20073, которая сохраняет обнаруженный диапазон в свойстве range:
@property (nonatomic, assign, readonly, getter=range) NSRange range;
Создание экземпляров данной исключительной ситуации обеспечивают классовые методы, которые декларируются в классе SCTextException:
+ (instancetype)exceptionWithRange:(NSRange)range name:(NSString *)name;
+ (instancetype)exceptionWithRange:(NSRange)range;
SCL-20074 - некорректный список индексов строк
Некорректный список индексов (список индексов, в котором есть хотя бы один некорректный индекс) вызывает ошибку SCL-20074, сохраняя этот список в свойстве indexSet:
@property (nonatomic, retain, readonly, getter=indexSet) NSIndexSet *indexSet;
- (NSIndexSet *)indexSet;
Класс SCTextException декларирует следующие классовые методы создания экземпляров данной исключительной ситуации:
+ (instancetype)exceptionWithIndexSet:(NSIndexSet *)indexSet name:(NSString *)name;
+ (instancetype)exceptionWithIndexSet:(NSIndexSet *)indexSet;
SCL-20075 - несоответствие количества индексов и строк
Некоторые методы текстовых объектов принимают в качестве аргументов списки индексов и списки объектов. Если количество элементов в этих списках не совпадает, то генерируется исключительная ситуация SCL-20075. Класс SCTextException определяет следующие свойства и методы для получения информации о данной ошибке:
@property (nonatomic, assign, readonly, getter=indexesCount)
SCULong indexesCount;
@property (nonatomic, assign, readonly, getter=stringsCount)
SCULong stringsCount;
Данные классовые методы класса SCTextException позволяют создавать экземпляры данной исключительной ситуации:
+ (instancetype)exceptionWithIndexesCount:(
SCULong)icount stringsCount:(
SCULong)scount name:(NSString *)name;
+ (instancetype)exceptionWithIndexesCount:(
SCULong)icount stringsCount:(
SCULong)scount;
SCL-20076 - пересекающиеся диапазоны строк
Если при работе с диапазонами строк в ряде случаев обнаруживается пересечение данных диапазонов, генерируется исключительная ситуация SCL-20076. Данные о пересекающихся диапазонах можно получить через следующие свойства и методы класса SCTextException:
@property (nonatomic, assign, readonly, getter=range) NSRange range;
@property (nonatomic, assign, readonly, getter=intersected) NSRange intersected;
- (NSRange)range;
- (NSRange)intersected;
Класс SCTextException реализует следующие классовые методы для создания экземпляров данной исключительной ситуации:
+ (instancetype)exceptionWithRange:(NSRange)range intersected:(NSRange)intersected name:(NSString *)name;
+ (instancetype)exceptionWithRange:(NSRange)range intersected:(NSRange)intersected;
SCL-20077 - ошибка записи данных в поток
Если текстовый объект обнаруживает ошибку, которая возникла в ходе записи данных в поток, генерируется исключительная ситуация SCL-20077. Указатель на вызвавший ошибку поток хранится в свойстве stream:
@property (nonatomic, assign, readonly, getter=stream)
SCStream *stream;
Чтобы создать экземпляр данной исключительной ситуации необходимо использовать следующие методы класса SCTextException:
+ (instancetype)writeErrorExceptionWithStream:(
SCStream *)stream name:(NSString *)name;
+ (instancetype)writeErrorExceptionWithStream:(
SCStream *)stream;
Группирующие классы
В данном разделе руководства программиста мы описываем группирующие классы, единственной задачей которых является образование упорядоченной иерархии дочерних классов, которые связаны между собой только с логической точки зрения. Никаких свойств и методов такие группирующие классы не декларируют. Создание экземпляров таких классов не имеет никакого смысла.
Класс SCDelegate
Класс SCDelegate объединяет в общую иерархию все классы-обработчики событий (классы делегирования). В текущей версии библиотеки данная иерархия имеет следующий вид:
Класс SCService
Класс SCService создает иерархию вспомогательных классов, которые очень редко используются вне тех или иных механизмов библиотеки. На данный момент иерархия сервисных классов выглядит следующим образом:
Доступ к информации о библиотеке
Информация, относящаяся непосредственно к библиотеке, доступна через классовые методы, реализованные в специальном классе SCCommon. Для вызова этих методов нет необходимости создавать экземпляры данного класса.
+ (NSString *)version;
+ (NSString *)fullVersion;
+ (NSString *)libraryInformation;
+ (NSString *)compilationDate;
+ (NSString *)compilationDateTime;
+ (NSString *)compilationString;
- Классовый метод version возвращает номер версии библиотеки:
2016-09-28 23:31:28.783 libtest[8834:1942657] 1.2.0-CURRENT
- Классовый метод fullVersion возвращает строку с названием и номером версии библиотеки:
2016-09-28 23:39:22.339 libtest[8887:1954500] Samond Classes Library 1.2.0-CURRENT
- С помощью классового метода sclBuild можно получить номер сборки библиотеки:
NSLog(
@"Build %d", [
SCCommon sclBuild]);
2016-09-28 23:54:35.747 libtest[8979:1972202] Build 161
- Классовый метод libraryInformation обеспечивает доступ к строке с полной информации об используемой версии библиотеки:
2016-09-28 23:57:10.370 libtest[9001:1974365] Samond Classes Library 1.2.0-CURRENT (Build 161)
- Классовые методы compilationDate, compilationDateTime и compilationString возвращают различную информацию о дате и времени компиляции библиотеки:
2016-09-28 23:58:03.212 libtest[9018:1975419] Sep 28 2016
2016-09-28 23:59:11.568 libtest[9035:1976903] Sep 28 2016 23:31:17
2016-09-29 00:00:28.849 libtest[9060:1978747] Compiled at Sep 28 2016 23:31:17
Типы и константы
В данном разделе руководства мы приводим описание неклассовых типов данных, констант и макросов, которые используются остальными компонентами библиотеки.
Стандартные типы данных
Для удобства программирования и обеспечения переносимости программного обеспечения между различными системами, библиотека вводит свои стандартные типы данных, которые определяются в файле SCTypes.h:
SCByte - Знаковый 8-битный целочисленный тип данных
SCShort - Знаковый 16-битный целочисленный тип данных
SCInteger - Знаковый 32-битный целочисленный тип данных
SCLong - Знаковый 64-битный целочисленный тип данных
SCUByte - Беззнаковый 8-битный целочисленный тип данных
SCUShort - Беззнаковый 16-битный целочисленный тип данных
SCUInteger - Беззнаковый 32-битный целочисленный тип данных
SCULong - Беззнаковый 64-битный целочисленный тип данных
SCFloat - Тип данных с плавающей точкой одинарной точности
SCDouble - Тип данных с плавающей точкой двойной точности
Ряд механизмов библиотеки использует специальный тип SCStandardType для идентификации различных данных, которые относятся к стандартным типам данных. Тип SCStandardType определяет следующие константы стандартных типов данных:
SCTypeByte = 1 - Знаковый 8-битный целочисленный тип данных
SCTypeShort = 2 - Знаковый 16-битный целочисленный тип данных
SCTypeLong = 4 - Знаковый 64-битный целочисленный тип данных
SCTypeUByte = 5 - Беззнаковый 8-битный целочисленный тип данных
SCTypeUShort = 6 - Беззнаковый 16-битный целочисленный тип данных
SCTypeULong = 8 - Беззнаковый 64-битный целочисленный тип данных
SCTypeFloat = 9 - Тип данных с плавающей точкой одинарной точности
SCTypeDouble = 10 - Тип данных с плавающей точкой двойной точности
SCTypeUChar = 13 - Односимвольный беззнаковый тип данных
Специализированные типы данных
Библиотека в файле SCTypes.h объявляет следующие специализированные типы данных:
SCSize - Беззнаковый тип размера данных
- Тип SCSize применяется в тех случаях, когда соответствующий ему аргумент используется для указания размерности каких-либо данных, например, количество записываемых в поток символов.
Типы поддержки коллекций
Для поддержки коллекций в файле SCTypes.h декларируются следующие типы данных:
SCIndex - Тип индекса элементов коллекций и строк текстовых объектов
- Тип SCIndex используется в индексируемых коллекциях и текстовых объектах в качестве типа индекса элемента.
Другие типы данных
Файл SCTypes.h содержит объявление следующих дополнительных типов данных:
- Тип SCCapacity определяет варианты разрядности целых чисел:
Макросы
Файл SCConstants.h содержит объявление следующих макросов:
#define SCLS( string) NSLocalizedString( string, nil)
#define __abstract__( name) { @throw [SCAbstractMethodException exceptionWithMethod:name]; }
- Макрос SCLS заменяется на вызов стандартной функции NSLocalizedString:
NSLog(
@"%@",
SCLS(
@"Message"));
2016-09-29 23:33:03.977 libtest[10630:2349707] Message
- Макрос abstract вызывает исключительную ситуацию обращения к абстрактому методу SCL-20001:
2016-09-29 23:34:23.971 libtest[10643:2350275] SCL-20001: Abstract method call detected ([
SCStream writeBytes:fromBuffer:])