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

на главную - закладки

Жанры

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

Если переменная типа signed int или signed short преобразуется в тип int или тип большего размера, то в результате преобразования слева тоже появляется описатель signed. Поэтому переменная типа short int, которая имеет значение -5, будет иметь значение -5 после преобразования в long int. Но если целая переменная с описателем unsigned преобразуется в тип int или тип большего размера, то расширение для знака не происходит (как и можно было ожидать).

На некоторых машинах (например, с процессорами Intel, которые используются в современных семействах компьютеров Macintosh, или с процессорами ARM, которые используются в iPhone и iTouch)

символы интерпретируются как значения со знаком. Это означает, что если символ (character) преобразуется в целый тип, то происходит расширение для знака. Если используются символы из стандартного набора символов ASCII, это не создает проблем. Но если значение символа не является частью этого стандартного набора символов, для его знака может быть выполнено расширение, если символ преобразуется в целый тип. Например, на компьютерах Мае символьная константа '\377’ преобразуется в значение -1, потому что это значение является отрицательным, если рассматривать его как 8-битное значение со знаком (signed).

Objective-C позволяет объявлять символьные переменны е без знака (unsigned), что позволяет избежать этой потенциальной проблемы — переменная unsigned char не получает расширения для знака при преобразовании в целый тип; ее значение всегда больше или равно нулю. Для обычного 8-битного символа символьная переменная со знаком имеет диапазон значений от -128 до +127 включительно. Символьная переменная без знака имеет диапазон значений от О до 255 включительно.

Если ваши символьные переменные должны получать расширение для знака, вы можете объявить такие переменные с типом signed char. В главе 15 вы узнаете о многобайтных символах Unicode. Это предпочтительный способ работы со строками. Упражнения

Используя класс Rectangle из главы 8, добавьте метод-инициализатор в соответствии со следующим объявлением.
– (Rectangle *) initWithWidth: (int) w: andHeight: (int) h;

С учетом того, что мы назвали метод, разработанный в упражнении 1, назначенным (designated) инициализатором для класса Rectangle, и основываясь на определениях классов Square и Rectangle из главы 8, добавьте методинициализатор в класс Square в соответствии со следующим объявлением.
– (Square *) initWithSide: (int) side;

Добавьте счетчик (counter) к методу add: класса Fraction, чтобы вычислять количество вызовов этого метода. Каким образом вы можете считывать значение этого счетчика?

Используя typedef и перечислимые типы данных, определите тип с именем Day (День) с возможными значениями Sunday, Monday, Tuesday, Wednesday, Thursday, Friday и Saturday (Воскресенье, Понедельник, Вторник, Среда, Четверг, Пятница и Суббота).

Используя typedef, определите тип с именем FractionObj, который позволяет писать следующие операторы. FractionObj И = [[Fraction alloc] init], f2 = [[Fraction alloc] init];

Используя определения float f = 1.00; short int i = 100; long int I = 500L; double d = 15.00; и семь шагов, описанных выше для преобразования операндов в выражениях, определите тип и значение следующих выражений. f + i l/d i / l + f 1 * i f / 2 i / (d + f) 1 / (i * 2.0) I + i / (double) I

Напишите программу, которая определяет, выполняется ли на вашей машине расширение для знака у переменных signed char.

Глава 11. Категории и протоколы

В этой главе описывается, как добавлять методы для класса в модульном стиле с помощью категорий

и как создавать стандартизованный список методов для реализации другими людьми. 11.1. Категории

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

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

Вы изучили, как использовать класс массивов из библиотеки Foundation framework с именем NSArray и поняли, что в этом классе необходимо реализовать один или нескольких методов. Конечно, вы могли бы написать новый подкласс класса NSArray и реализовать эти новые методы, но есть более простой способ. На практике для разрешения подобных ситуаций используются категории (category). Категория представляет простой способ модульного определения класса в виде групп или категорий связанных методов. Она также позволяет достаточно просто расширить существующее определение класса без доступа к существующему исходному коду этого класса или создания подкласса. Это мощная и достаточно простая для изучения концепция.

Вернемся к первому примеру и покажем, как добавить новую категорию в класс Fraction для работы с четырьмя основными арифметическими операциями. Приведем исходную секцию interface для Fraction. #import <Foundation/Foundation.h> #import <stdio.h> // Определение класса Fraction @interface Fraction : NSObject { int numerator; int denominator; } @property int numerator, denominator; -(void) setTo: (int) n over: (int) d; -(Fraction *) add: (Fraction *) f; -(void) reduce; -(double) convertToNum; -(void) print; @end

Теперь удалим метод add: из этой секции interface и добавим его в новую категорию вместе с тремя другими арифметическими операциями, которые нужно реализовать. Ниже показана секция in te rfa c e д л я новой категории MathOpS. #import «Fraction.h» @interface Fraction (MathOps) -(Fraction *) add: (Fraction *) f; -(Fraction *) mul: (Fraction *) f; -(Fraction *) sub: (Fraction *) f; -(Fraction *) div: (Fraction *) f; @end

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

После строки «import мы вилим следующую строку: @interface Fraction (MathOps)

Она указывает компилятору, что для класса Fraction определяется новая категория с именем MathOps. Имя категории после имени класса заключено в круглые скобки. Отметим, что здесь не указывается родительский класс для Fraction; компилятору уже извес тно о нем из Fraction.h. Кроме того, мы ничего не сообщаем ему о переменных экземпляра, хотя делали это во всех предыдущих секциях interface. На самом деле мы получим от компилятора сообщение о синтаксической ошибке, если попытаемся включить родительский класс или переменные экземпляра.

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

Ваше Сиятельство

Моури Эрли
1. Ваше Сиятельство
Фантастика:
фэнтези
попаданцы
5.00
рейтинг книги
Ваше Сиятельство

Меченный смертью. Том 2

Юрич Валерий
2. Меченный смертью
Фантастика:
аниме
фэнтези
попаданцы
5.00
рейтинг книги
Меченный смертью. Том 2

Черный дембель. Часть 4

Федин Андрей Анатольевич
4. Черный дембель
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Черный дембель. Часть 4

Бастард Императора. Том 14

Орлов Андрей Юрьевич
14. Бастард Императора
Фантастика:
городское фэнтези
аниме
фэнтези
попаданцы
5.00
рейтинг книги
Бастард Императора. Том 14

Бастард Императора. Том 2

Орлов Андрей Юрьевич
2. Бастард Императора
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Бастард Императора. Том 2

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

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

Искатель 2

Шиленко Сергей
2. Валинор
Фантастика:
фэнтези
попаданцы
рпг
5.00
рейтинг книги
Искатель 2

Телохранитель Цесаревны

Зот Бакалавр
5. Герой Империи
Фантастика:
фэнтези
боевая фантастика
5.25
рейтинг книги
Телохранитель Цесаревны

Император Пограничья 10

Астахов Евгений Евгеньевич
10. Император Пограничья
Фантастика:
городское фэнтези
аниме
фантастика: прочее
попаданцы
5.00
рейтинг книги
Император Пограничья 10

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

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

Я все еще не князь. Книга XV

Дрейк Сириус
15. Дорогой барон!
Фантастика:
юмористическое фэнтези
попаданцы
аниме
5.00
рейтинг книги
Я все еще не князь. Книга XV

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

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

Тринадцатый II

NikL
2. Видящий смерть
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Тринадцатый II

Идеальный мир для Лекаря 29

Сапфир Олег
29. Лекарь
Фантастика:
юмористическое фэнтези
аниме
фэнтези
5.00
рейтинг книги
Идеальный мир для Лекаря 29