Программирование на Objective-C 2.0
Шрифт:
При следующем вызове calculateTriangularNumber передается аргумент 20. Значение 20 становится значением формального параметра п внутри функции. Затем функция вычисляет значение 20-го треугольного числа и выводит резуль-тат. Возвращение результатов функций
Как и методы, функции могут возвращать значение. Тип значения, возвращае-мого с помощью оператора return, должен быть согласован с типом возвращае-мого значения, объявленного для этой функции. В объявлении функции, которое начинается с float kmh_to_mph (float km_speed)
содержится определение функции с именем kmh_to_mph, которая принимает один аргумент типа float с
определяет функцию ged (наибольший общий делитель) с целыми аргументами и и v и возвращает целое значение.
Мы перепишем алгоритм определения наибольшего общего делителя, ис-пользуемый в программе 5.7, в форме функции. Этой функции передаются два аргумента в виде двух чисел, для которых нужно определить их наибольший общий делитель (ged, greatest common divisor), см. программу 13.5. #import <Foundation/Foundation.h> // Эта функция ищет наибольший общий делитель двух // неотрицательных целых значений и возвращает соответствующий результат int gcd (int u, int v) { int temp; while ( v != 0 ) { temp = u % v; u = v; v = temp; } return u; } main {) { NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init]; int result; result = ged (150, 35); NSLog (@"The ged of 150 and 35 is %i", result); result - ged (1026, 405); NSLog (@nThe ged of 1026 and 405 is %i“, result); NSLog (<§>nThe ged of 83 and 240 is %Г, ged (83, 240)); [pool drain]; return 0; }
Вывод программы 13.5 The gcd of 150 and 35 is 5 (Наибольший общий делитель 150 и 35 равен 5) The gcd of 1026 and 405 is 27 The gcd of 83 and 240 is 1
Функция ged принимает два целых аргумента. Данная функция имеет доступ к этим аргументам через имена формальных параметров и и V. После объявления переменной temp типа int программа выводит на терминал значения аргументов и и v вместе с соответствующим сообщением. Затем функция вычисляет и возвращает наибольший общий делитель этих двух целых чисел.
В строке result = gcd (150, 35);
происходит вызов функции gcd с аргументами 150 и 35 и сохранение значения, которое возвращает функция, в переменной result.
Если не указан тип возвращаемого значения функции, компилятор предпо-лагает, что функция возвращает целое значение (если она вообще возвращает значение). Многие программисты не указывают тип возвращаемого значения, если функция должна возвращать целые значения. Однако такой подход про-тиворечит практике надежного программирования. Компилятор предупредит, что для возвращаемого значения задан по умолчанию тип int, но это признак того, что вы делаете что-то неверно!
Тип по умолчанию для возвращаемого значения отличается от методов. Если для метода не указан тип возвращаемого значения, компилятор предполагает, что метод возвращает значение типа id. Но для метола тоже следует указывать тип возвращаемого значения. Объявление типов возвращаемых значений и типов аргументов
По умолчанию компилятор Objective-C предполагает тип int для возвращаемого значения. Точнее говоря, если вызывается функция, компилятор предполагает, что эта функция возвращает значение типа int, за исключением следующих случаев.
Эта функция определена в программе до того, как встретился вызов этой функции.
Значение, возвращаемое функцией, объявлено до того, как встретился вызов этой функции. Объявление типов возвращаемого значения и аргументов для функции называется объявлением прототипа (prototype).
Объявление
функции используется не только для объявления типа возвра-щаемого значения функции, но также для того, чтобы указать компилятору, сколько аргументов и каких типов передавать функции. Это аналогично объяв-лению методов в секции @interface при объявлении нового класса.Чтобы объявить absoluteValue как функцию, которая возвращает значение типа float и при и и мает один аргумент типа float, можно использовать следующее объявление прототипа. float absoluteValue (float);
Достаточно указать только тип аргумента в круглых скобках, но не его имя. Вы можете дополнительно указать после типа «фиктивное» имя, например, float absoluteValue (float х);
Это имя не обязательно должно совпадать с именем в определении функции (в любом случае, компиля тор его игнорирует).
Для надежности при объявлении прототипа скопируйте первую строку из фактического объявления функции. Не забудьте поставить в конце точку с за- пятой. Если функция принимает переменное число параметров (как в случае с NSLog и scant), об этом нужно информировать компилятор. Объявление void NSLog (NSString *format, ...);
указывает компилятору, что NSLog принимает объект типа NSString в качестве первого аргумента, после которого следует любое число дополнительных аргу-ментов. NSLog объявляется в специальном файле Foundation/Foundation.h , и поэтому в начале каждой программы мы помещаем строку #import <Foundation/Foundation.h>
Без этой строки компилятор может предполагать, что NSLog принимает фиксированное число аргументов, что может привести неверному генерируе-мому коду.
Компилятор автоматически преобразует числовые аргументы в соответствующие типы при вызове функции, если вы поместили определение функции или объявили функцию и ее ар1ументы до этого вызова.
Ниже приводятся некоторые сведения о функциях.
По умолчанию компилятор предполагает, что функция возвращает значение типа int.
Определяя функцию с возвращаемым значением типа int, определите ее та-ким же образом.
Определяя функцию, которая не возвращает никакого значения, определите ее с ключевым словом void.
Компилятор преобразует аргументы для согласования с аргументами, кото-рые ожидает функция, только если вы ранее определили или объявили эту функцию. Для надежности объявляйте все функции в своей программе, даже если они определены до их вызова. Лучше всего поместить объявления ваших функций в header-файл и затем просто импортировать этот файл в ваши модули.
Функции по умолчанию являются внешними (external). Область действия по умолчанию для функции устроена так, чтобы ее могли вызывать любые функции или методы, содержащиеся в любых файлах, которые связаны с этой функцией. Вы можете ограничить область действия функции, сделав ее статической. Для этого нужно поместить перед объявлением функции ключевое слово static, как показано ниже. static int ged (int u, int v) { ... }
Статическую функцию могуг вызывать только другие функции или методы, которые находятся в одном файле с определением этой функции. Функции, методы и массивы
Чтобы передать функции или методу один элемент массива, его нужно указать как аргумент. Например, если функция squareRoot вычисляет квадратные корни, и мы хотим получить квадратный корень от averages[i] и присвоить результат переменной sq_root_result. то можно написать оператор sq_root_result = squareRoot (averagesfi]);