Главная » iPhone, Objective-C, Программирование для iOS и MacOS » Когда использовать функцию Objective-C?

0

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

Создайте для экспериментов новый проект, программу командной строки С с именем  ClassCertificates

Первая идея выглядит примерно так:

int main (int argc, const char * argv[])

{

printf("Mark has done as much Cocoa Programming as I could fit into 5 day

\n");

printf("Bo has done as much Objective-­‐C Programming as I could fit into 2 days\n");

printf("Mike has done as much Python Programming as I could fit into 5 days

\n");

\n");

printf("Ted has done as much iOS Programming as I could fit into 5 days

return 0;

}

Вас беспокоит необходимость вбивать все эти сообщения? Они раздражают, вас своим однообразием? Поздравляю, у вас задатки отличного программиста. Когда вам приходится помногу раз делать нечто очень похожее (в данном случае – набирать сообщения в команде printf), подумайте, нельзя ли воспользоваться функцией для достижения того же результата.

Как написать и использовать функцию?

Итак, нам нужна функция; остается понять, как ее написать. Откройте файл main.c в проекте ClassCertificates и введите новую функцию перед функцией main. Этой функции будет присвоено имя congratulateStudent.

#include <stdio.h>

void congratulateStudent(char *student, char *course, int numDays)

{

printf("%s has done as much %s Programming as I could fit into %d days.\n", student, course, numDays);

}

(Вы  спрашиваете,  что  означают  эти  загадочные  %s и  %d?  Потерпите;  мы поговорим о них в следующей главе.)

Теперь  отредактируйте  функцию  main,  чтобы  в  ней  использовалась  новая

функция:

int main (int argc, const char * argv[])

{

congratulateStudent("Mark", "Cocoa", 5);

congratulateStudent("Bo", "Objective-­‐C", 2);

congratulateStudent("Mike", "Python", 5);

congratulateStudent("Ted", "iOS", 5);

return 0;

}

Постройте и запустите программу. Вероятно, вы получите предупреждение, помеченное восклицательным знаком в желтом треугольнике. Предупреждения в Xcode не мешают выполнению вашей программы; они всего лишь привлекают ваше внимание к возможной проблеме. Текст предупреждения выводится справа от кода. В этом предупреждении говорится что-то вроде «Нет предшествующего прототипа для функции ‘congratulateStudent’». Пока не обращайте внимания, мы вернемся к предупреждению в конце раздела.

Найдите вывод программы в навигаторе журнала, Он должен быть идентичен тому, что вы бы увидели, если бы каждая строка была введена вручную.

Mark has done as much Cocoa Programming as I could fit into 5 days.

Bo has done as much Objective-­‐C Programming as I could fit into 2 days. Mike has done as much Python Programming as I could fit into 5 days. Ted has done as much iOS Programming as I could fit into 5 days.

Подумайте, что здесь произошло. Мы заметили повторяющуюся закономерность. Мы извлекли все общие характеристики проблемы (повторяющийся текст) и переместили их в отдельную функцию. Осталось разобраться с различиями (имя студента, название курса, количество дней). Для них в функцию были включены три параметра. Давайте еще раз посмотрим на ту строку, в которой присваивается имя функции.

void congratulateStudent(char *student, char *course, int numDays)

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

А что означает void слева от имени функции? Это тип информации, возвращаемой функцией. Если функция не возвращает ничего, используйте ключевое слово void. Мы поговорим о возвращаемых значениях функций позднее в этой главе.

Новая функция использовалась (или вызывалась) в функции main. При вызове congratulateStudent мы передаем этой функции значения, которые называются аргументами. Значение аргумента присваивается соответствующему параметру. Имя параметра используется внутри функции как переменная, содержащая переданное значение.

Рассмотрим  конкретный  пример.  В  первом  вызове  congratulateStudent

передаются три аргумента: "Mark", "Сосоа" и 5.

congratulateStudent("Mark", "Cocoa", 5);

Пока займемся третьим аргументом. Переданное функции congratulateStudent значение 5 присваивается третьему параметру (numDays). Аргументы присваиваются параметрам в порядке следования, при этом значения должны иметь тот же (или очень близкий) тип. У нас 5 – целое число, а параметр numDays имеет тип int… Подходит.

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

Еще раз посмотрите на первую версию ClassCertificates с однообразными командами. Зачем мы использовали функцию? Что бы не набирать лишние символы на компьютере? Да, но это определенно не все. Не стоит забывать и о проверке

ошибок. Чем меньше вы набираете , и чем больше за вас работает компьютер, тем

меньше вероятность опечатки. Если вы ошибетесь при вводе имени функции. Xcode

предупредит вас, но Xcode понятия не имеет об ошибках при вводе обычного текста.

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

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

А теперь вернемся к предупреждению в коде. На практике функция очень часто объявляется в одном месте, а определяется в другом. Объявление функции просто предупреждает о том, что где-то дальше имеется функция с таким именем. В определении функции вы перечисляете те действия, которые эта функция должна выполнять. В нашем упражнении функция объявлялась и определялась в одном месте. Так как это нетипично, Xcode выдает предупреждение, если функция не была объявлена заранее.

Рис. 5.1. Отключение предупреждений о прототипах функции

Работая над проектами, которые мы будем создавать в этой книге, на предупреждения можно просто не обращать внимания. А если хотите, отключите это предупреждение – выберите объект ClassCertificates в верхней части навигатора проекта. На панели редактора выберите раздел All на вкладке Build Settings. Прокрутите разные варианты настройки построения приложений, найдите строку Missing Function Prototypes и измените ее значение на No.

Источник: Аарон Хилегас, «Objective-C. Программирование для iOS и MacOS», 2012 г.

По теме:

  • Комментарии