Ear*_*rey 7 protocols interface objective-c ios
我在自己的头文件中有一个protocolA,用作接口.然后我有两个具体的类,它们是该协议的不同实现.
现在,在我的ViewController中,我使用它来声明一个id类型的属性,它允许我在没有VC知道任何相关信息的情况下交换实现.
我还有protocolB,它用于从这两个实现对象到VC的委托调用.
问题是我有循环依赖.
在协议A中,我需要声明类型为id的"delegate"属性.在协议B中,委托方法正在向调用者发送引用,调用者是id类型的对象...
有更好的设计吗?
更新示例,也许对其他人有帮助.
ProtocolA标头:
#import <Foundation/Foundation.h>
/*!
Abstract interface for any Provider
*/
@protocol DataProviderDatasource <NSObject>
@required
@property (nonatomic) id <DataProviderDelegate> delegate;
-(void)update;
@end
Run Code Online (Sandbox Code Playgroud)
ProtocolB标头
#import <Foundation/Foundation.h>
#import "DataProviderDatasource.h"
/*!
Protocol that each Data Provider implements to make delegate calls to notify its delegate about data management operations.
*/
@protocol DataProviderDelegate <NSObject>
-(void)dataProviderWillUpdate:(id<DataProviderDatasource>)dataProvider;
-(void)dataProviderdidUpdate:(id<DataProviderDatasource>)dataProvider;
Run Code Online (Sandbox Code Playgroud)
@结束
jus*_*tin 13
像类一样,你可以转发声明协议:
@protocol MONProtocolB; // << forward declaration -- #import not required
@protocol MONProtocolA
- (void)setDensity:(NSValue<MONProtocolB>*)pValue;
^^^^^^^^^^^^ << compiler recognizes this as an
objc protocol
@end
Run Code Online (Sandbox Code Playgroud)
那么当编译器看到协议名称并且循环依赖被破坏时,编译器将不会barf(除非你的协议都来自另一个当然是愚蠢的).
然后你可以#import在任何有身体依赖的地方使用MONProtocolB.
| 归档时间: |
|
| 查看次数: |
2419 次 |
| 最近记录: |