Да, вы можете.Вот пример.
Сначала объявите ваш протокол в .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