Статьи

Изучите Цель-C: День 6

В сегодняшнем уроке вы узнаете о категориях и о том, как использовать их для расширения функциональности классов Cocoa-Touch. Это наш последний выпуск в серии «Learn Objective-C», поэтому вам также будет предоставлен краткий обзор того, что мы уже рассмотрели, а затем посмотрите, что вы можете сделать, чтобы повысить свои навыки в качестве Objective-C или iPhone. разработчик приложений.

Итак, что такое категории? Многие учебники и серии Objective-C пропускают категории, что обидно, потому что они настолько полезная языковая функция, которая удивительно полезна. Категории помогают содержать код в чистоте и меньше загромождать, устраняя необходимость в ненужных подклассах. Из того, что мы узнали до сих пор, если бы у нас был объект NSString, который мы хотели бы добавить, чтобы сделать что-то вроде добавления метода, который заменил бы все символы «a» на «4» (бесполезно, я знаю, но, например, только для целей), тогда мы могли бы создать подкласс NSString и добавить метод сами. Мы также видели этот вид подклассов, когда создавали класс автомобилей. В конце этого урока я попросил вас создать подкласс автомобилей, чтобы вы могли добавить функциональность в базовый класс. Подклассы — это хороший подход, и я ни в коем случае не говорю вам прекратить создавать подклассы, но в определенных ситуациях категории предоставляют лучший подход для добавления некоторой дополнительной функциональности в класс.

Категории позволяют нам добавлять методы к существующему классу, чтобы все экземпляры этого класса в вашем приложении получали вашу функциональность. Например, допустим, у нас есть 100 объектов NSString в вашем приложении, но вы хотите создать собственный подкласс, чтобы у каждого NSString был дополнительный метод (например, reverseString). С категориями мы можем просто добавить метод в категорию, и всем экземплярам будет разрешено использовать новый метод. Синтаксис, очевидно, немного отличается от подклассов, и категории не позволяют вам использовать переменные экземпляра. Тем не менее, можно перезаписать метод, который уже существует, но это следует делать с осторожностью, и только если это действительно необходимо.

Категории следуют тому же синтаксическому макету, что и класс, так как они имеют реализацию и интерфейс. Интерфейс выглядит так:

Легко, правда? Итак, давайте посмотрим на пример. Мы собираемся сделать простой метод, который обратит строку. Пока этот метод практически бесполезен; важно не то, что делает метод. Вы уже должны знать, как будет выглядеть интерфейс, но в любом случае это так:

Теперь для создания нашей реализации:

Далее нам нужно добавить простой код, чтобы перевернуть строку. Поскольку мы добавляем методы в класс NSString, мы ссылаемся на строку, используя self. Теперь, чтобы перевернуть строку, нам понадобится новый временный строковый объект для хранения перевернутой строки. Способ, которым мы перевернем строку, состоит в том, чтобы просто перебрать существующую строку в обратном порядке, каждый раз, когда мы находим новый символ, мы добавляем его к объекту обратной строки. Код для этого:

Этот метод довольно прост, мы повторяем один раз для каждого символа в строке. Мы добавляем текущий символ, используя stringWithFormat и идентификатор символа (C). Когда мы вызываем —length, мы не только возвращаем целое число длины, мы также вычитаем из него, как наш цикл движется вдоль строки.

Если все прошло хорошо, то все NSString, уже находящиеся в нашем проекте, должны соответствовать нашей новой категории. Теперь вы можете понять, почему категории так полезны!

Хорошо, теперь все наши объекты NSString должны иметь наш метод reverseString. Напомним, наш код должен выглядеть так:

Каждый блок кода (интерфейс и реализация) должен быть в соответствующих файлах по соглашению. Тем не менее, мы называем категории немного по-другому. Два файла, которые мы создали, называются: NSString+reverse.h (интерфейс) и NSString+reverse.m (реализация).

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

Если все прошло по плану, то Консоль должна записать обратную версию «Просто тест»!

Если все идет не по плану, убедитесь, что вы правильно скопировали код для reverseString, и убедитесь, что вы включили файл заголовка (* .h) для категории в ваш основной файл кода.

Как видите, категории действительно очень полезны (особенно со строками). Они имеют широкий спектр применения в любом проекте, и я использую валидацию. Таким образом, я могу хранить всю свою проверку в одном месте и не использовать сложные подклассы.

Это не только конец сегодняшнего урока, но и конец серии об основах Objective-C. За последние несколько уроков мы рассмотрели следующие темы:

  • Основы программирования
  • Основы ООП
  • Классы и Подклассы
  • Управление памятью
  • Хорошая практика
  • Некоторые стандартные соглашения об именах

Я надеюсь, что вам понравилась эта серия, и если вы до сих пор читали только один или два учебника, то я призываю вас начать с первого дня и читать учебник в день. К концу серии вы должны быть достаточно уверенными, чтобы начать писать свой собственный код всего за неделю!

Если у вас есть какие-либо вопросы о серии или показанных примерах, или если вы хотите получить дополнительное руководство по другой области программирования Objective-C, не стесняйтесь оставлять комментарии ниже.

Если у вас есть какие-либо вопросы относительно самой Objective-C, проекта, над которым вы работаете, или просто каких-либо технических советов, не стесняйтесь, напишите мне упоминание или отправьте прямое сообщение в Twitter или посетите мой веб-сайт и найдите свой путь к Форма обратной связи!

Теперь, когда мы закончили, проблемы бесконечны. Я настоятельно рекомендую вам положить перо на бумагу и выбрать первое приложение, которое будет создано с нуля. Придумайте идею и дизайн, затем примените все принципы, которые вы узнали из этой серии, и дайте нам знать, что вы придумали!

Спасибо за прочтение!