Глава 2: Объектно-ориентированное программирование (ООП) ← Вернуться к списку глав Глава 4: Управление памятью в Objective-C

Глава 3: Изучение синтаксиса Objective-C

Поздравляем с тем, что вы добрались до третьей главы! Вы уже узнали основы программирования и познакомились с объектно-ориентированным программированием. Теперь пришло время глубже погрузиться в особенности языка Objective-C. Не волнуйтесь, мы объясним все простым и понятным языком, чтобы вы могли легко во всем разобраться.


3.1. Сообщения и синтаксис квадратных скобок

Как объекты общаются между собой

В Objective-C объекты общаются друг с другом с помощью сообщений. Отправка сообщения — это способ попросить объект выполнить определенный метод.

Синтаксис квадратных скобок

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

Пример:

[object method];

Пример с реальным объектом:

Person *person = [[Person alloc] init];
[person sayHello];

Отправка сообщений с параметрами

Если метод принимает параметры, они указываются внутри сообщения.

Пример:

[object methodWithParameter:value];

Реальный пример:

[person greetWithName:@"Анна"];

3.2. Методы и функции: в чем разница?

Функции

Пример функции:

int addNumbers(int a, int b) {
    return a + b;
}
int result = addNumbers(5, 3); // result будет 8

Методы

Объявление метода в классе:

- (void)instanceMethod;
+ (void)classMethod;

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

- (void)sayHello {
    NSLog(@"Привет!");
}

Вызов метода:

[person sayHello];

Главные отличия


3.3. Свойства (@property) и автоматические методы доступа (@synthesize)

Что такое свойства?

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

Объявление свойства:

@property NSString *name;

@synthesize — автоматическое создание методов доступа

Раньше, чтобы свойства работали, нужно было использовать @synthesize в реализации класса:

@synthesize name = _name;

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

Использование свойств

person.name = @"Иван";
NSString *personName = person.name;

Атрибуты свойств

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

Примеры атрибутов:

Пример с атрибутами:

@property (nonatomic, strong) NSString *name;
@property (nonatomic, readonly) int age;

3.4. Категории

Зачем нужны категории?

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

Создание категории

Объявление категории:

@interface ExistingClass (CategoryName)

- (void)newMethod;

@end

Реализация категории:

@implementation ExistingClass (CategoryName)

- (void)newMethod {
    // Реализация метода
}

@end

Пример: Добавим метод к NSString

Объявление категории:

@interface NSString (ReversedString)

- (NSString *)reversedString;

@end

Реализация категории:

@implementation NSString (ReversedString)

- (NSString *)reversedString {
    NSUInteger length = [self length];
    NSMutableString *result = [NSMutableString stringWithCapacity:length];

    for (NSInteger i = length - 1; i >= 0; i--) {
        unichar c = [self characterAtIndex:i];
        [result appendFormat:@"%C", c];
    }

    return result;
}

@end

Использование:

NSString *original = @"Objective-C";
NSString *reversed = [original reversedString];
NSLog(@"%@", reversed); // Вывод: "C-evitcejbO"

3.5. Протоколы

Что такое протоколы?

Протоколы в Objective-C похожи на интерфейсы в других языках программирования. Они определяют набор методов, которые класс может или должен реализовать. Это полезно для создания гибких и расширяемых приложений.

Объявление протокола

@protocol ProtocolName <NSObject>

@required
- (void)requiredMethod;

@optional
- (void)optionalMethod;

@end

Реализация протокола в классе

@interface MyClass : NSObject <ProtocolName>

@end

@implementation MyClass

- (void)requiredMethod {
    // Реализация обязательного метода
}

- (void)optionalMethod {
    // Реализация необязательного метода (если нужно)
}

@end

Использование протоколов

Протоколы особенно полезны при работе с делегатами и источниками данных (data sources).

Пример:

Представьте, что у вас есть протокол Printable, который требует реализации метода printDetails.

@protocol Printable <NSObject>

- (void)printDetails;

@end

Классы Book и Magazine могут реализовать этот протокол.

Класс Book:

@interface Book : NSObject <Printable>

@property NSString *title;
@property NSString *author;

@end

@implementation Book

- (void)printDetails {
    NSLog(@"Книга: %@, Автор: %@", self.title, self.author);
}

@end

Класс Magazine:

@interface Magazine : NSObject <Printable>

@property NSString *name;
@property int issueNumber;

@end

@implementation Magazine

- (void)printDetails {
    NSLog(@"Журнал: %@, Номер выпуска: %d", self.name, self.issueNumber);
}

@end

Использование:

Book *book = [[Book alloc] init];
book.title = @"1984";
book.author = @"Джордж Оруэлл";

Magazine *magazine = [[Magazine alloc] init];
magazine.name = @"Наука и жизнь";
magazine.issueNumber = 5;

NSArray *printables = @[book, magazine];

for (id<Printable> item in printables) {
    [item printDetails];
}

3.6. Больше о синтаксисе

Селекторы (Selectors)

Селектор — это способ представить название метода в виде данных.

Пример получения селектора:

SEL mySelector = @selector(methodName);

Пример использования селектора:

if ([object respondsToSelector:@selector(methodName)]) {
    [object performSelector:@selector(methodName)];
}

Динамическая типизация

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

Пример:

if ([object isKindOfClass:[NSString class]]) {
    NSLog(@"Это строка!");
}

Заключение

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


Практические задания

Задание 1: Расширяем NSString

  1. Создайте категорию для NSString, добавив метод - (BOOL)isPalindrome, который проверяет, является ли строка палиндромом (читается одинаково слева направо и справа налево).
  2. Используйте этот метод для проверки нескольких строк.

Пример:

NSString *word1 = @"level";
NSString *word2 = @"hello";

BOOL isPalindrome1 = [word1 isPalindrome]; // YES
BOOL isPalindrome2 = [word2 isPalindrome]; // NO

Задание 2: Создаем протокол "Playable"

  1. Объявите протокол Playable с методом - (void)play.
  2. Создайте классы Song и Video, которые реализуют этот протокол.
  3. В методе play для Song выводите "Играет песня: название", для Video — "Воспроизводится видео: название".
  4. Создайте массив объектов, соответствующих протоколу Playable, и вызовите у них метод play.

Пример:

Song *song = [[Song alloc] init];
song.title = @"Imagine";

Video *video = [[Video alloc] init];
video.title = @"Природа";

NSArray *playlist = @[song, video];

for (id<Playable> item in playlist) {
    [item play];
}

Задание 3: Работа с селекторами

  1. Создайте класс Performer с методами - (void)dance и - (void)sing.
  2. Напишите метод, который принимает селектор и вызывает соответствующий метод у объекта Performer.
  3. Проверьте, что метод корректно вызывается для обоих селекторов.

Пример:

Performer *performer = [[Performer alloc] init];

SEL action = @selector(dance);
[performer performAction:action]; // Выводит "Танцует"

action = @selector(sing);
[performer performAction:action]; // Выводит "Поет"

Продолжение следует...

В следующей главе мы поговорим об управлении памятью в Objective-C, узнаем, что такое ARC, и разберемся с сильными и слабыми ссылками. Это важная тема, которая поможет вам писать эффективный и надежный код.

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

До встречи в следующей главе и удачи в вашем обучении!

Глава 2: Объектно-ориентированное программирование (ООП) ← Вернуться к списку глав Глава 4: Управление памятью в Objective-C

Просмотров: 51