У меня есть два класса, в которых оба имеют протоколы для реализации.
Могу ли я реализовать один из протоколов класса в другой и наоборот?
Вызывает ли это какую-либо ошибку времени выполнения?
У меня есть два класса, в которых оба имеют протоколы для реализации.
Могу ли я реализовать один из протоколов класса в другой и наоборот?
Вызывает ли это какую-либо ошибку времени выполнения?
Но я не думаю, что это действительно необходимо. После того, как вы реализовали делегат, вы можете отправить сообщение другому классу как тот же объект делегата. Я предполагаю, что простые отношения делегата как;
Класс А
@protocol ClassAProtocol;
@interface ClassA:NSObject
@property(nonatomic, assign) id<ClassAProtocol> delegate;
@end
@protocol ClassAProtocol <NSObject>
-(void)classA:(ClassA*)classa didSomething:(id)object;
@end
@implementation ClassA
-(void)classAFinishedSomething{
[self.delegate classA:self didSomething:nil];
[(ClassB*)self.delegate doSomething];
}
@end
Класс Б
@interface ClassB : NSObject<ClassAProtocol>
-(void)doSomething;
@end
@implementation ClassB
-(void)doSomething{
}
-(void)classA:(ClassA*)classa didSomething:(id)object{
}
@end
Это не создаст циклическую ссылку между двумя объектами и, я полагаю, сохранит код в чистоте. Эта логика действительна, если делегат всегда относится к классу B и он responsesToSelector:, который отправляется как сообщение классу B. Но приведенный выше пример, опубликованный Мэттом, является жестким режимом, если вы хотите изолировать журнал между классами и общаться через стандартный механизм.
Ваша проблема - циклические зависимости. Предварительное объявление также не поможет, поскольку вы просто получите предупреждение компилятора о том, что он не может видеть определения протоколов. Есть два варианта:
Разделите протоколы на их собственные заголовочные файлы:
Класс А.ч:
#import <Foundation/Foundation.h>
#import "ClassBProtocol.h"
@interface ClassA : NSObject <ClassBProtocol>
@end
КлассB.h:
#import <Foundation/Foundation.h>
#import "ClassAProtocol.h"
@interface ClassB : NSObject <ClassAProtocol>
@end
КлассAProtocol.h:
#import <Foundation/Foundation.h>
@protocol ClassAProtocol <NSObject>
...
@end
КлассBProtocol.h:
#import <Foundation/Foundation.h>
@protocol ClassBProtocol <NSObject>
...
@end
Если вам не нужно внешне объявлять, что вы реализуете протоколы, вы можете использовать категорию продолжения класса:
Класс А.ч:
#import <Foundation/Foundation.h>
@interface ClassA : NSObject
@end
КлассA.m:
#import "ClassA.h"
#import "ClassB.h"
@implementation ClassA () <ClassBProtocol>
@end
@implementation ClassA
@end
КлассB.h:
#import <Foundation/Foundation.h>
@interface ClassB : NSObject
@end
КлассB.м:
#import "ClassB.h"
#import "ClassA.h"
@implementation ClassB () <ClassAProtocol>
@end
@implementation ClassB
@end