Чтение онлайн

на главную

Жанры

Программирование на Objective-C 2.0
Шрифт:

Обратите внимание, что файл секции interface импортируется в файл секции implementation с помощью следующего оператора: #import Traction.h"

Это позволяет компилятору получать информацию о классах и методах, объявленных для класса Fraction, и обеспечивать согласованность между этими файлами. Переменные экземпляра внутри класса обычно не переобъявляют внутри секции implementation (хотя это можно делать), чтобы компилятор брал эту информацию из секции interface, содержащейся в Fraction.h.

Импортируемый файл заключается в кавычки, а не в угловые скобки (< и >), как <Foundation/Foundation.h>. Кавычки используются для локальных файлов (создаваемых вами вместо системных файлов), и они показывают компилятору, где искать указанный файл. Когда используются кавычки, компилятор обычно ищет сначала указанный файл в текущей папке, а затем — в списке других мест. Вы можете указывать для компилятора конкретные места поиска.

Пример тестовой программы в файле FractionTest.m: #import "Fraction.h" int main (int argc, char *argv[]) { NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init]; Fraction *myFraction = [[Fraction alloc] init]; // задание дроби (fraction) 1/3 [myFraction setNumerator: 1]; [myFraction setDenominator: 3]; // вывод дроби NSLog (@"The value of myFraction is:"); [myFraction print]; [myFraction release]; [pool drain]; return 0; }

Программа FractionTest.m включает файл секции interface Fraction.h, а не файл секции implementation Fraction.m. Таким образом, она разделена на три отдельных файла. Вы можете компилировать и запускать программу точно так же, как раньше. Выберите Build and Go в меню Build или щелкните на значке Build and Go в основном окне Xcode.

Если вы компилируете программы из командной строки, укажите компилятору Objective-C оба файла с расширением «.т». При использовании дсс командная строка будет выглядеть следующим образом: gcc -framework Foundation Fraction.m FractionTest.m -о FractionTest

В результате будет создан исполняемый файл с именем FractionTest. Ниже приводятся результаты вывода при выполнении этой программы.

Вывод программы 7.1 FractionTest The value of myFraction is: (Значение myFraction) 1/3 7.2. Синтезируемые методы доступа

В Objective-C 2.0 методы-установщики (setter) и методы-получатели (getter) (которые называют методами доступа — accessor methods) можно генерироваться автоматически. Мы не описывали этого до настоящего момента, поскольку было важно, чтобы вы поняли, как писать эти методы самостоятельно. Однако это настолько удобно, что пора объяснить вам, как использовать эту возможность.

Первый шаг — задание свойств в директиве (@property в секции interface. К этим свойствам относятся переменные экземпляра. Для класса Fraction в эту категорию попадают две переменные экземпляра: numerator и denominator. Ниже приводится новая секция interface с добавлением директивы (@property. @interface Fraction : NSObject { int numerator; int denominator; } @property int numerator, denominator; -(void) print; -(double) convertToNum; @end

Мы больше не включаем определения методов-получателей и методов-установщиков: numerator, denominator, setNumerator: и setDenominator:. Нам нужно, чтобы компилятор Objective-C автоматически генерировал, или синтезировал (synthesize) их для нас. Для этого служит директива (@synthesize в секции implementation, как показано ниже. #import «Fraction.h» @implementation Fraction @synthesize numerator, denominator; -(void) print {NSLog (@"%i/%i", numerator, denominator); } -(double) convertToNum { if (denominator != 0) return (double) numerator / denominator; else return 1.0; @end

Следующая строка указывает компилятору Objective-C, что нужно создать по паре методов (установщик и получатель) для каждой из указанных переменных экземпляра (numerator и denominator). @synthesize numerator, denominator;

В общем случае, если у вас есть переменная экземпляра с именем х, то включение следующей строки в секцию implementation указывает компилятору, что нужно синтезировать метод-получатель с именем х и метод-установщик с именем setX:. @synthesize х;

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

А теперь вернемся к программе 7.1 и внесем указанные изменения в секции interface и implementation, чтобы методы доступа синтезировалисьы автоматически. Убедитесь, что программа выводит те же результаты. 7.3. Доступ к свойствам с помощью оператора «точка»

Для доступа к свойствам имеется более удобный синтаксис. Чтобы получить значение числителя (numerator), хранящееся в myFraction, можно использовать строку [myFraction numerator]

Сообщение numerator передается объекту myFraction, он возвращает требуемое значение. С помощью оператора «точка» можно написать эквивалентное выражение: my Fraction, numerator

Его общий формат instance.property (экземпляр.свойство)

Этот синтаксис присваивает значения: instance, property = значение

Это эквивалентно выражению [instance setProperty: значение]

В программе 7.1 мы задали numerator (числитель) и denominator (знаменатель) дроби 1/3 с помощью двух строк кода: [myFraction setNumerator: 1]; [myFraction setDenominator: 3];

Ниже приводится эквивалентный способ записи этих строк: myFraction.numerator = 1; myFraction.denominator = 3;

Далее мы будем использовать эти средства для синтеза методов и доступа к свойствам. 7.4. Передача методам нескольких аргументов

Продолжим работу с классом Fraction и внесем некоторые дополнения. Мы определили шесть методов. Было бы хорошо иметь такой метод, чтобы можно было задавать числитель и знаменатель с помощью одного сообщения. Если метод принимает несколько аргументов, после каждого аргумента ставится двоеточие. Аргументы становятся частью имени метода. Например, метод с именем addEntryWithName:andEmail: принимает два аргумента : имя (name) и адрес электронной почты (email). Метод addEntryWithName:andEmail:andPhone: принимает три аргумента: имя, адрес электронной почты и номер телефона (phone).

Метод, с помощью которого задаются numerator (числитель) и denominator (знаменатель), можно было бы назвать setNumerator:andDenominator: и использовать следующим образом: [myFraction setNumerator: 1 andDenominator: 3];

Это вполне подходящий выбор для имени метода, но можно подобрать и более удобное для чтения имя метода, например, setTo:over:. Присвоим myFraction значение 1/3 и сравним это сообщение с предыдущим вариантом: [myFraction setTo: 1 over: 3]; (присвоить 1, деленное на 3)

Поделиться:
Популярные книги

Первый среди равных. Книга VI

Бор Жорж
6. Первый среди Равных
Фантастика:
аниме
фэнтези
попаданцы
5.00
рейтинг книги
Первый среди равных. Книга VI

Отверженный. Дилогия

Опсокополос Алексис
Отверженный
Фантастика:
фэнтези
7.51
рейтинг книги
Отверженный. Дилогия

Газлайтер. Том 1

Володин Григорий
1. История Телепата
Фантастика:
попаданцы
альтернативная история
аниме
5.00
рейтинг книги
Газлайтер. Том 1

Сводный гад

Рам Янка
2. Самбисты
Любовные романы:
современные любовные романы
эро литература
5.00
рейтинг книги
Сводный гад

Второгодка. Книга 2. Око за око

Ромов Дмитрий
2. Второгодка
Фантастика:
героическая фантастика
альтернативная история
фэнтези
5.00
рейтинг книги
Второгодка. Книга 2. Око за око

Гримуар темного лорда VII

Грехов Тимофей
7. Гримуар темного лорда
Фантастика:
боевая фантастика
попаданцы
аниме
фэнтези
5.00
рейтинг книги
Гримуар темного лорда VII

Князь

Шмаков Алексей Семенович
5. Светлая Тьма
Фантастика:
юмористическое фэнтези
городское фэнтези
аниме
сказочная фантастика
5.00
рейтинг книги
Князь

Барону наплевать на правила

Ренгач Евгений
7. Закон сильного
Фантастика:
боевая фантастика
попаданцы
аниме
5.00
рейтинг книги
Барону наплевать на правила

Локки 9. Потомок бога

Решетов Евгений Валерьевич
9. Локки
Фантастика:
фэнтези
попаданцы
героическая фантастика
боевая фантастика
5.00
рейтинг книги
Локки 9. Потомок бога

Законы Рода. Том 2

Андрей Мельник
2. Граф Берестьев
Фантастика:
фэнтези
аниме
5.00
рейтинг книги
Законы Рода. Том 2

Законник Российской Империи. Том 2

Ткачев Андрей Юрьевич
2. Словом и делом
Фантастика:
городское фэнтези
альтернативная история
аниме
дорама
6.40
рейтинг книги
Законник Российской Империи. Том 2

Рядовой. Назад в СССР. Книга 1

Гаусс Максим
1. Второй шанс
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Рядовой. Назад в СССР. Книга 1

Князь

Мазин Александр Владимирович
3. Варяг
Фантастика:
альтернативная история
9.15
рейтинг книги
Князь

Командор космического флота

Борчанинов Геннадий
3. Звезды на погонах
Фантастика:
боевая фантастика
космическая фантастика
космоопера
5.00
рейтинг книги
Командор космического флота