Spec-Zone .ru
спецификации, руководства, описания, API

Библиотека Разработчика iOS

Разработчик

Начните Разрабатывать приложения для iOS Сегодня

PDF
На этой странице

Запись пользовательского класса

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

Например, рассмотрите вкладку World Clock в приложении Часов iOS. Ячейки в этом табличном представлении должны вывести на экран больше содержания, чем стандартная ячейка табличного представления. Это - хорошая возможность реализовать подкласс, расширяющий поведение UITableViewCell позволять Вам вывести на экран дополнительные пользовательские данные для данной ячейки табличного представления. При разработке этого пользовательского класса Вы могли бы добавить выходы для метки для отображения часов вперед информация и представление изображения для отображения пользовательских часов справа от ячейки.

image: ../Art/custom_class_2x.png

Эта глава учит Вас, что необходимо знать о синтаксисе Objective C и структуре класса, чтобы закончить реализовывать поведение приложения ToDoList. Это обсуждает проект ToDoItem, пользовательский класс, который будет представлять единственный элемент в Вашем списке ожидающих выполнения задач. В третьем учебном руководстве Вы фактически реализуете этот класс и добавите его к Вашему приложению.

Объявление и реализация класса

Спецификация класса в Objective C требует двух отличных частей: интерфейс и реализация. Интерфейс указывает точно, как данный тип объекта предназначается, чтобы использоваться другими объектами. Другими словами, это определяет открытый интерфейс между экземплярами класса и внешнего мира. Реализация включает исполняемый код для каждого метода, объявленного в интерфейсе.

Объект должен быть разработан для сокрытия подробных данных его внутренней реализации. В Objective C интерфейс и реализация обычно помещаются в отдельные файлы так, чтобы Вы обнародовали только интерфейс. Как с кодом C, Вы определяете заголовочные файлы и исходные файлы для разделения публичных заявлений от подробных данных реализации кода. Интерфейсные файлы имеют a .h расширение и файлы реализации имеют a .m расширение. (Вы фактически создадите эти файлы для ToDoItem класс в Учебном руководстве: Добавьте Данные — на данный момент, просто следуйте вперед, поскольку представлены все части.)

Интерфейс

Синтаксис Objective C, используемый для объявления интерфейса класса, похож на это:

  1. @interface ToDoItem : NSObject
  2. @end

Этот пример объявляет названный класс ToDoItem, который наследовался от NSObject.

Общедоступные свойства и поведение определяются в @interface объявление. В этом примере ничто не указано вне суперкласса, таким образом, единственное поведение ожидало быть доступным на экземплярах ToDoItem поведение, наследованное от NSObject. Все объекты, как ожидают, будут иметь минимальное поведение, так по умолчанию, они должны наследоваться от NSObject (или один из его подклассов).

Реализация

Синтаксис Objective C, используемый для объявления реализации класса, похож на это:

  1. #import "ToDoItem.h"
  2. @implementation ToDoItem
  3. @end

Если Вы объявите какие-либо методы в интерфейсе класса, то необходимо будет реализовать их в этом файле.

Свойства хранят данные объекта

Рассмотрите, какую информацию к - делают элемент должен содержать. Вероятно, необходимо знать его имя, когда это создавалось, и было ли это завершено. В Вашем пользовательском ToDoItem класс, Вы будете хранить эту информацию в свойствах.

Объявления для этих свойств находятся в интерфейсном файле (ToDoItem.h). Вот то, на что они похожи:

  1. @interface ToDoItem : NSObject
  2. @property NSString *itemName;
  3. @property BOOL completed;
  4. @property NSDate *creationDate;
  5. @end

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

Для объявления свойства, только для чтения, Вы указываете, что в свойстве приписывают. Например, если Вы не хотите дату создания ToDoItem чтобы быть изменяемыми, Вы могли бы обновить ToDoItem интерфейс класса для сходства с этим:

  1. @interface ToDoItem : NSObject
  2. @property NSString *itemName;
  3. @property BOOL completed;
  4. @property (readonly) NSDate *creationDate;
  5. @end

Свойства могут быть частными или общедоступными. Иногда это целесообразно делать свойство частным так, чтобы другие классы не видели или получили доступ к нему. Например, если Вы хотите отслеживать свойство, представляющее дату, элемент был отмечен, как завершено, не предоставляя другой доступ классов к этой информации, Вы делаете свойство частным путем помещения его в расширение класса, которое Вы добавляете после #import оператор вершина Вашего файла реализации (ToDoItem.m), как показано здесь.

  1. #import "ToDoItem.h"
  2. @interface ToDoItem ()
  3. @property NSDate *completionDate;
  4. @end
  5. @implementation ToDoItem
  6. @end

Вы получаете доступ к свойствам с помощью методов get и методов set. Метод get возвращает значение свойства, и метод set изменяет его. Общее синтаксическое сокращение для доступа к методам get и методам set является записью через точку. Для свойств с доступом для чтения и доступом для записи, можно использовать запись через точку и для получения и для установки значения свойства. Если у Вас есть объект toDoItem из класса ToDoItem, можно сделать следующее:

  1. toDoItem.itemName = @"Buy milk"; //Sets the value of itemName
  2. NSString *selectedItemName = toDoItem.itemName; //Gets the value of itemName

Методы определяют поведение объекта

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

Например, для предоставления - делают элемент (ToDoItem) возможность, которая будет отмечена как завершенные, можно добавить a markAsCompleted метод к интерфейсу класса. Позже, Вы реализуете поведение этого метода в реализации класса, как описано в Реализации Методов.

  1. @interface ToDoItem : NSObject
  2. @property NSString *itemName;
  3. @property BOOL completed;
  4. @property (readonly) NSDate *creationDate;
  5. - (void)markAsCompleted;
  6. @end

Знак «минус» (-) впереди имени метода указывает, что это - метод экземпляра, который можно вызвать на объекте того класса. Этот знак «минус» дифференцирует его от методов класса, обозначенных со знаком «плюс» (+). Методы класса можно вызвать на самом классе. Типичный пример методов класса является методами фабрики классов, о которых Вы узнали в Работе с Основой. Можно также использовать методы класса получить доступ к части общей информации, связанной с классом.

void ключевое слово используется в круглых скобках в начале объявления, чтобы указать, что метод не возвращает значение. В этом случае, markAsCompleted метод не берет ни в каких параметрах. Параметры обсуждены более подробно в Параметрах Метода.

Параметры метода

Вы объявляете, что методы с параметрами проводят данные, при вызове метода.

Например, можно пересмотреть markAsCompleted метод от предыдущего фрагмента кода для взятия в единственном параметре, определяющем, отмечен ли элемент завершенный или незаконченный. Таким образом, можно переключить состояние завершения элемента вместо того, чтобы установить его только, как завершено.

  1. @interface ToDoItem : NSObject
  2. @property NSString *itemName;
  3. @property BOOL completed;
  4. @property (readonly) NSDate *creationDate;
  5. - (void)markAsCompleted:(BOOL)isComplete;
  6. @end

Теперь, Ваш метод берет в одном параметре, isComplete, который имеет тип BOOL.

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

  1. - (void)markAsCompleted:(BOOL)isComplete onDate:(NSDate *)date;

Здесь, имя метода написано как markAsCompleted:onDate:. Имена isComplete и date используются в реализации для доступа к значениям, предоставленным, когда метод вызывают, как будто эти имена были переменными.

Реализация методов

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

Вот простая реализация markAsCompleted: метод обсудил ранее:

  1. @implementation ToDoItem
  2. - (void)markAsCompleted:(BOOL)isComplete {
  3. self.completed = isComplete;
  4. }
  5. @end

Как свойства, методы могут быть частными или общедоступными. Открытые методы объявляют в открытом интерфейсе и так могут заметить и вызвать другие объекты. Их соответствующая реализация находится в файле реализации и не может быть замечена другими объектами. Закрытые методы имеют только реализацию и являются внутренними к классу, означая, что они только доступны для вызова в реализации класса. Это - мощный механизм для добавления внутреннего поведения к классу, не предоставляя другой доступ объектов к нему.

Например, скажите, что Вы хотите сохранить к - делают элемент completionDate обновленный. Если к - делают элемент отмечен, как завершено, установить completionDate к текущей дате. Если это отмечено как незаконченное, установить completionDate к nil, потому что это еще не было завершено. Поскольку обновление к - делает элемент completionDate автономная задача, наиболее успешная практика должна записать свой собственный метод для нее. Однако важно удостовериться, что другие объекты не могут вызвать этот метод — иначе, другой объект мог установить в - делают элемент completionDate к чему-либо в любое время. Поэтому Вы делаете этот метод частным.

Для выполнения этого Вы обновляете реализацию ToDoItem включать закрытый метод setCompletionDate это вызывают внутри markAsCompleted: для обновления к - делают элемент completionDate каждый раз, когда это отмечено, как завершено или незаконченное. Заметьте, что Вы ничего не добавляете к интерфейсному файлу, потому что Вы не хотите другие объекты видеть этот метод.

  1. @implementation ToDoItem
  2. - (void)markAsCompleted:(BOOL)isComplete {
  3. self.completed = isComplete;
  4. [self setCompletionDate];
  5. }
  6. - (void)setCompletionDate {
  7. if (self.completed) {
  8. self.completionDate = [NSDate date];
  9. } else {
  10. self.completionDate = nil;
  11. }
  12. }
  13. @end

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