Как создать экземпляр интерфейса в соответствии с протоколом с идентификатором типа <..> - PullRequest
0 голосов
/ 04 октября 2019

Я опираюсь на цель-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
...