Obj-c, я могу использовать протокол как тип параметра для аргументов функции? - PullRequest
0 голосов
/ 15 октября 2018

Я создаю сенсорный каркас какао, чтобы разделить некоторый общий код между моими приложениями.

Мне нужно передать экземпляр класса в метод, который имеет некоторые специфические свойства.

Метод будет вызываться из приложения.

Я совершенно новичок в использовании протоколов.

Должен ли я создать файл h протокола в моей структуре со всеми свойствами, требуемыми функцией.

Если это так, я могу передать протокол как тип переменной экземпляра в функцию?

Если нет, как этого добиться?

1 Ответ

0 голосов
/ 15 октября 2018

Да, вы можете.Вот пример.

Сначала объявите ваш протокол в .h файле:

@protocol Vehicle <NSObject>

@property NSNumber * numberOfWheels;

@required
-(void)engineOn;

@end

Объявите классы, соответствующие вашему протоколу:

#import "Vehicle.h"

@interface Car : NSObject <Vehicle>

@end

Реализуйтенеобходимые методы и синтезируют свойства:

@implementation Car
@synthesize numberOfWheels;

-(void)engineOn {
    NSLog(@"Car engine on");
}

@end

и другое, для примера:

#import "Vehicle.h"

@interface Motorcycle : NSObject <Vehicle>

@end

@implementation Motorcycle
@synthesize numberOfWheels;

-(void)engineOn {
    NSLog(@"Motorcycle engine on");
}

@end

Когда вы объявляете метод, который хотите принять аргумент Vehicleвы используете общий тип id и указываете, что любой передаваемый объект должен соответствовать Vehicle:

#import "Vehicle.h"

@interface Race : NSObject

-(void)addVehicleToRace:(id<Vehicle>)vehicle;

@end

Затем в реализации этого метода вы можете использовать свойства и методы, объявленные впротокол, независимо от конкретного типа, который был передан в:

@implementation Race

-(void)addVehicleToRace:(id<Vehicle>)vehicle {
    [vehicle engineOn];
}

@end

Затем, как и следовало ожидать, вы можете передавать экземпляры конкретных классов, которые соответствуют вашему протоколу:

Motorcycle *cycle = [[Motorcycle alloc] init];
cycle.numberOfWheels = 2;
Car *car = [[Car alloc] init];
car.numberOfWheels = 4;
Race *race = [[Race alloc] init];
[race addVehicleToRace:car];
[race addVehicleToRace:cycle];

И соответствующая конкретная реализация методов протокола будет выполнена в зависимости от конкретных конкретных типов, которые вы передаете в качестве параметра:

2018-10-15 13:53:45.039596+0800 ProtocolExample[78912:1847146] Car engine on
2018-10-15 13:53:45.039783+0800 ProtocolExample[78912:1847146] Motorcycle engine on
...