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

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

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

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

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

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

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

5
Jules 15 Окт 2018 в 00:46

1 ответ

Лучший ответ

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

Сначала объявите свой протокол в файле .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
6
Pete Morris 15 Окт 2018 в 06:45