Я опираюсь на цель-c и пытаюсь выучить @protocol. Я разработал приведенный ниже пример. Но что мне не понятно, так это код в main_1 и main_2. Для main_1 я подумал, что это может быть более или менее похоже на java, например, * sampleClass является экземпляром SampleClass, следовательно, он не должен иметь доступа к методу ProcessComplete. Однако в Objective-c код работает….
Для main_2 я пытаюсь создать экземпляр объекта SampleClass, который содержит SampleClass в качестве разработчика протокола. В отличие от кода в main_1, я предполагал или думал, что в коде в main_1 предоставлен экземпляр SampleClass, но НЕ как разработчика протокола.
1 - Пожалуйста, исправьте меня, если я не прав. 2 - пожалуйста, дайте мне знать, почему в коде main_2 я получил следующие ошибки:
Implicit conversion of an Objective-C pointer to '__strong id<PrintClientProtocol> *' is disallowed with ARC
Pointer to non-const type 'id<PrintClientProtocol>' with no explicit ownership
Incompatible pointer types initializing '__strong id<PrintClientProtocol> *' with an expression of type 'SampleClass *'
main_1
SampleClass *sampleClass = [[SampleClass alloc] init];
[sampleClass startAction];
[sampleClass processCompleted];
main_2
id<PrintClientProtocol> *sampleClass2 = [[SampleClass alloc] init];
[sampleClass2 startAction];
[sampleClass2 processCompleted];
printClass.h
#ifndef PrintClass_h
#define PrintClass_h
#endif /* PrintClass_h */
//The class/interface that to execute the protocols in the client contract. execution is to be done according
//to the DELEGATE Class/Interface
@interface PrintClass :NSObject {
id implementor;//instance of the DELEGATE/implementor and executor class/interface
//change id to SampleClass for testing
}
- (void) printDetails;
- (void) setDelegate: (id) implementor;
@end
printClass.m
#import <Foundation/Foundation.h>
#import "PrintClass.h"
#import "SampleClass.h"
@implementation PrintClass
- (void) printDetails {
NSLog(@"Printing Details");
[implementor processCompleted];
}
- (void) setDelegate:(id)newDelegate {
implementor = newDelegate;
}
@end
SampleClass.h
#ifndef SampleClass_h
#define SampleClass_h
#endif /* SampleClass_h */
#import "PrintClientProtocol.h"
//the class/interface that provide implementions and execution of it, which is the "DELEGATE"
@interface SampleClass : NSObject<PrintClientProtocol>
- (void)startAction;
@end
SampleClass.m
#import <Foundation/Foundation.h>
#import "SampleClass.h"
#import "PrintClass.h"
@implementation SampleClass
-(void)startAction {
PrintClass *printClass = [[PrintClass alloc] init];
[printClass setDelegate: self];
[printClass printDetails];
}
-(void) processCompleted {
NSLog(@"PROCESS_COMPLETED.....");
}
@end
PrintClientProtocol :
#import <Foundation/Foundation.h>
NS_ASSUME_NONNULL_BEGIN
//the protocol that demands or needs implementor and executor "Client/Delegatee Protocol"
@protocol PrintClientProtocol <NSObject>
- (void) processCompleted;
@end
NS_ASSUME_NONNULL_END