Работа с основой
Поскольку Вы начинаете писать код Objective C для своего приложения, Вы найдете много платформ, которые можно использовать в своих интересах. Из особого значения платформа Основы, предоставляющая базовые услуги для всех приложений. Платформа Основы включает классы значения, представляющие типы исходных данных, такие как строки и числа, а также классы набора для того, чтобы хранить другие объекты. Вы будете полагаться на значение и классы записи набора большая часть кода для Вашего приложения ToDoList.
Объекты значения
Платформа Основы обеспечивает классы, генерирующие объекты значения для строк, двоичных данных, дат и времени, чисел и других значений.
Объект значения является объектом, инкапсулирующим примитивное значение (типа данных C) и предоставляющим услуги, связанные с тем значением. Вы часто встречаетесь с объектами значения как с параметрами и возвращаемыми значениями методов и функций, которые вызывает Ваше приложение. Различные части платформы — или даже различных платформ — могут обмениваться данными путем передачи объектов значения.
Некоторые примеры объектов значения в платформе Основы:
NSString
иNSMutableString
NSData
иNSMutableData
NSDate
NSNumber
NSValue
Поскольку объекты значения представляют скалярные значения, можно использовать их в наборах и везде, где еще требуются объекты. Объекты значения имеют преимущество перед типами примитивов, которые они инкапсулируют: Они позволяют Вам выполнить определенные операции на инкапсулированном значении просто и эффективно. NSString
класс, например, имеет методы для поиска и замены подстрок для записи строк к файлам или (предпочтительно) URLs, и для построения путей файловой системы.
Вы создаете объект значения из данных типа примитива. NSNumber
класс обеспечивает пример этого подхода.
int n = 5; // Value assigned to primitive type
NSNumber *numberObject = [NSNumber numberWithInt:n]; // Value object created from primitive type
Позже, можно получить доступ к инкапсулированным данным от объекта.
int y = [numberObject intValue]; // Encapsulated value obtained from value object (y == n)
Большинство классов значения создает свои экземпляры путем объявления обоих инициализаторов и методов фабрики классов. Методы фабрики классов — реализованный классом как удобство для клиентов — комбинируют выделение и инициализацию за один шаг и возврат созданный объект. Например, NSString
класс объявляет a string
метод класса, выделяющий и инициализирующий новый экземпляр класса и возвращает его Вашему коду.
NSString *string = [NSString string];
В дополнение к созданию объектов значения и разрешению Вам получить доступ к их инкапсулированным значениям, большинство классов значения обеспечивает методы для простых операций, таких как объектное сравнение.
Строки
Objective C и C поддерживают те же соглашения для указания строк: Отдельные символы включаются одинарными кавычками, и строки символов окружаются двойными кавычками. Но платформы Objective C обычно не используют струны до. Вместо этого они используют NSString
объекты.
NSString
класс обеспечивает объектную обертку для строк, предложение преимуществ, таких как встроенное управление памятью для хранения произвольной длины представляет в виде строки, поддержка различных кодировок символов (особенно Unicode), и утилиты для строкового форматирования. Поскольку Вы обычно используете такие строки, Objective C обеспечивает краткую нотацию для создания NSString
объекты от постоянных значений. Использовать это NSString
литерал, только предшествуйте дважды заключенной в кавычки строке со знаком at sign (@
), как показано в следующих примерах:
// Create the string "My String" plus newline.
NSString *myString = @"My String\n";
// Create the formatted string "1 String".
NSString *anotherString = [NSString stringWithFormat:@"%d %@", 1, @"String"];
// Create an Objective-C string from a C string.
NSString *fromCString = [NSString stringWithCString:"A C string" encoding:NSUTF8StringEncoding];
Числа
Objective C предлагает краткую нотацию для создания NSNumber
объекты, устраняя необходимость вызвать инициализаторы или методы фабрики классов для создания таких объектов. Просто предшествуйте числовому значению со знаком at sign (@
) и дополнительно следуйте за ним с индикатором типа значения. Например, можно создать NSNumber
объекты, инкапсулирующие целочисленное значение и двойное значение:
NSNumber *myIntValue = @32;
NSNumber *myDoubleValue = @3.22346432;
Можно даже использовать NSNumber
литералы для создания инкапсулировавших булевых и символьных ценностей.
NSNumber *myBoolValue = @YES;
NSNumber *myCharValue = @'V';
Можно создать NSNumber
объекты, представляющие целых без знака, длинных целых, долгих длинных целых и плавание, оценивают путем добавления букв U, L, LL и F, соответственно, к записанному нотами значению. Например, для создания NSNumber
объект, инкапсулирующий значение плавающее, можно записать:
NSNumber *myFloatValue = @3.2F;
Объекты коллекции
Большинство объектов коллекции в коде Objective C является экземплярами основного класса набора —NSArray
, NSSet
, и NSDictionary
. Классы набора используются для управления группами объектов, таким образом, любой элемент, который Вы хотите добавить к набору, должен быть экземпляром класса Objective C. Если необходимо добавить скалярное значение, необходимо сначала создать подходящее NSNumber
или NSValue
экземпляр для представления его.
Любой объект, который Вы добавляете к набору, будет поддержан, по крайней мере, пока поддерживается набор. Поэтому классы набора используют сильные ссылки для отслеживания их содержание. В дополнение к отслеживанию их содержания каждый класс набора упрощает выполнять определенные задачи, такие как перечисление, получая доступ к конкретным изделиям, или узнавая, является ли определенный объект частью набора.
Содержание NSArray
, NSSet
, и NSDictionary
классы установлены при создании. Поскольку их содержание не может изменяться в течение долгого времени, эти классы вызывают неизменные. У каждого также есть подкласс, это является непостоянным, чтобы позволить Вам добавлять или удалять объекты по желанию. Различные типы наборов организуют свои содержащие в нем объекты отличительными способами:
NSArray
иNSMutableArray
. Массив является упорядоченным набором объектов. Вы получаете доступ к объекту путем указания его позиции (т.е. его индекса) в массиве. Первый элемент в массиве в индексе 0 (нуль).NSSet
иNSMutableSet
. Набор хранит неупорядоченный набор объектов с каждым объектом, происходящим только один раз. Вы обычно доступ возражаете в наборе путем применения тестов или фильтров к объектам в наборе.NSDictionary
иNSMutableDictionary
. Словарь хранит свои записи как пары ключ/значение; ключ является уникальным идентификатором, обычно строка, и значение является объектом, который Вы хотите хранить. Вы получаете доступ к этому объекту путем указания ключа.
Массивы
Массив (NSArray
) представляет упорядоченный набор объектов. Единственное требование - то, что каждый элемент является объектом Objective C — нет никакого требования для каждого объекта быть экземпляром того же класса.
Для поддержания порядка в массиве каждый элемент сохранен в основанном на нуле индексе.
Создание массивов
Вы создаете массив через методы фабрики классов или инициализацию. Множество различной инициализации и методов фабрики доступно, в зависимости от числа объектов.
+ (id)arrayWithObject:(id)anObject;
+ (id)arrayWithObjects:(id)firstObject, ...;
- (id)initWithObjects:(id)firstObject, ...;
Поскольку arrayWithObjects:
и initWithObjects:
методы оба берут a nil
- завершенное, переменное число параметров, необходимо включать nil
как последнее значение.
id firstObject = @"someString";
id secondObject = @"secondString";
id thirdObject = @"anotherString";
NSArray *someArray =
[NSArray arrayWithObjects:firstObject, secondObject, thirdObject, nil];
Предыдущий пример создает массив с тремя объектами. Первый объект, firstObject
, будет иметь индекс массива 0
; последний объект, thirdObject
, будет иметь индекс 2
.
Возможно создать литерал массивов с помощью компактного синтаксиса.
NSArray *someArray = @[firstObject, secondObject, thirdObject];
При использовании этого синтаксиса не завершайте список объектов с nil
— фактически, nil
недопустимое значение. Например, при попытке выполнить следующий код, Вы получите исключение во время выполнения:
id nilObject = nil;
NSArray *someArray = @[firstObject, nilObject];
// exception: "attempt to insert nil object"
Запросы объектов массива
После создания массива можно запросить его для получения информации — такой как, сколько объектов он имеет или содержит ли он данный элемент.
NSUInteger numberOfItems = [someArray count];
if ([someArray containsObject:secondObject]) {
...
}
Можно также запросить массив для элемента в данном индексе. При попытке запросить недопустимый индекс, то Вы доберетесь за пределы исключение во время выполнения. Чтобы избежать получать исключение, всегда проверяйте число элементов сначала.
if ([someArray count] > 0) {
NSLog(@"First item is: %@", [someArray objectAtIndex:0]);
}
Эти проверки в качестве примера, чтобы видеть, больше ли число элементов, чем нуль. Если это, функция Основы NSLog
регистрирует описание первого элемента, имеющего индекс 0
.
Как альтернатива использованию objectAtIndex:
, запросите массив с помощью нижнего синтаксиса, точно так же, как получающего доступ к значению в стандарте C массив. Предыдущий пример может быть переписан как это:
if ([someArray count] > 0) {
NSLog(@"First item is: %@", someArray[0]);
}
Сортировка объектов массива
NSArray
класс предлагает множество методов для сортировки его собранных объектов. Поскольку NSArray
является неизменным, каждый метод возвращает новый массив, содержащий элементы в сортированном порядке.
Например, можно сортировать массив строк путем вызова compare:
на каждой строке.
NSArray *unsortedStrings = @[@"gamma", @"alpha", @"beta"];
NSArray *sortedStrings =
[unsortedStrings sortedArrayUsingSelector:@selector(compare:)];
Переменчивость массива
Несмотря на то, что NSArray
сам класс является неизменным, он может, тем не менее, содержать непостоянные объекты. Например, если Вы создаете неизменный массив, содержащий непостоянную строку, как это:
NSMutableString *mutableString = [NSMutableString stringWithString:@"Hello"];
NSArray *immutableArray = @[mutableString];
нет ничего, чтобы мешать Вам видоизменить строку.
if ([immutableArray count] > 0) {
id string = immutableArray[0];
if ([string isKindOfClass:[NSMutableString class]]) {
[string appendString:@" World!"];
}
}
Если Вы хотите добавить или удалить объекты из массива после начального создания, использовать NSMutableArray
, который добавляет множество методов, чтобы добавить, удалить или заменить один или несколько объектов.
NSMutableArray *mutableArray = [NSMutableArray array];
[mutableArray addObject:@"gamma"];
[mutableArray addObject:@"alpha"];
[mutableArray addObject:@"beta"];
[mutableArray replaceObjectAtIndex:0 withObject:@"epsilon"];
Этот пример создает массив, составленный из объектов @"epsilon"
, @"alpha"
, и @"beta"
.
Также возможно сортировать непостоянный массив на месте, не создавая вторичный массив.
[mutableArray sortUsingSelector:@selector(caseInsensitiveCompare:)];
В этом случае содержавшие элементы сортируются в возрастание, нечувствительный к регистру порядок @"alpha"
, @"beta"
, и @"epsilon"
.
Наборы
Набор (NSSet
) объект подобен массиву, но он поддерживает неупорядоченную группу отдельных объектов.
Поскольку наборы не поддерживают порядок, они предлагают более быструю производительность, чем массивы делают когда дело доходит до тестирования на членство.
Поскольку основное NSSet
класс является неизменным, его содержание должно быть указано при создании, с помощью или инициализатора или метода фабрики классов.
NSSet *simpleSet =
[NSSet setWithObjects:@"Hello, World!", @42, aValue, anObject, nil];
Как с NSArray
, initWithObjects:
и setWithObjects:
методы оба берут a nil
- завершенное, переменное число параметров. Имя непостоянного NSSet
подкласс NSMutableSet
.
Даже при попытке добавить объект несколько раз, придает значение только одна ссылка на отдельный объект.
NSNumber *number = @42;
NSSet *numberSet =
[NSSet setWithObjects:number, number, number, number, nil];
// numberSet only contains one object
Словари
Вместо того, чтобы просто поддерживать упорядоченный или неупорядоченный набор объектов, словарь (NSDictionary
) хранит объекты, связанные с данными ключами, которые могут тогда использоваться для извлечения.
Наиболее успешная практика должна использовать строковые объекты в качестве ключей словаря.
Несмотря на то, что можно использовать другие объекты в качестве ключей, иметь в виду, что каждый ключ копируется для использования словарем и поддержка - также NSCopying
. Если Вы хотите использовать кодирование значения ключа, однако, необходимо использовать строковые ключи для объектов словаря. (Для узнавания больше посмотрите, что Значение ключа Кодирует Руководство по программированию).
Создание словарей
Можно создать словари через инициализацию, или можно использовать методы фабрики классов, как это:
NSDictionary *dictionary = [NSDictionary dictionaryWithObjectsAndKeys:
someObject, @"anObject",
@"Hello, World!", @"helloString",
@42, @"magicNumber",
someValue, @"aValue",
nil];
Для dictionaryWithObjectsAndKeys:
и initWithObjectsAndKeys:
методы, каждый объект указан, прежде чем его ключ и список объектов и ключей должны быть nil
- завершенный.
Objective C предлагает краткий синтаксис для создания литерала словаря.
NSDictionary *dictionary = @{
@"anObject" : someObject,
@"helloString" : @"Hello, World!",
@"magicNumber" : @42,
@"aValue" : someValue
};
Для литералов словаря указан ключ перед его объектом, и список объектов и ключей не nil
- завершенный.
Запросы словарей
После создания словаря можно попросить у него объекта, хранившего против данного ключа.
NSNumber *storedNumber = [dictionary objectForKey:@"magicNumber"];
Если объект не найден, objectForKey:
возвраты метода nil
.
Существует также нижняя альтернатива синтаксиса использованию objectForKey:
.
NSNumber *storedNumber = dictionary[@"magicNumber"];
Переменчивость словаря
Если необходимо добавить или удалить объекты из словаря после создания, используйте NSMutableDictionary
подкласс.
[dictionary setObject:@"another string" forKey:@"secondString"];
[dictionary removeObjectForKey:@"anObject"];
Представление ноля с NSNull
Не возможно добавить nil
к классам набора, описанным в этом разделе, потому что nil
в Objective C не означает “объекта”. Если Вы не должны представлять “объект” в наборе, используйте NSNull
класс.
NSArray *array = @[ @"string", @42, [NSNull null] ];
С NSNull
, null
метод всегда возвращает тот же экземпляр. Классы, ведущие себя таким образом, вызывают singleton-классами. Можно проверить, чтобы видеть, равен ли объект в массиве совместно используемому NSNull
экземпляр как это:
for (id object in array) {
if (object == [NSNull null]) {
NSLog(@"Found a null object");
}
}
Несмотря на то, что платформа Основы содержит еще много возможностей, чем описано здесь, Вы не должны знать каждую подробность сразу же. Если Вы действительно хотите узнать больше об Основе, смотреть на Ссылку Платформы Основы. На данный момент у Вас есть достаточно информации, чтобы продолжать реализовывать Ваше приложение ToDoList, которое Вы сделаете путем записи пользовательского класса данных.