私有协议实施?

时间:2014-02-02 00:45:43

标签: ios objective-c

我正在尝试将接口设为私有,它会给我一个警告,即分配给 'id'来自不兼容的类型'test *'哪个奇怪有人知道一个解决方法?

//test.h
@interface test : NSObject


//test.m 
@interface test() <testProtocol>

@end

@implementation

-(void) Request
{
}
@end

//protocolAndClass.h
@interface protocolAndClass : NSObject
@property (weak,nonatomic) id<testProtocol> delegate;
@end

//protocolAndClass.m

@protocol testProtocol <NSObject>
@required
-(void) Request;
@optional
@end

// Top Level Classes

test* t = [[test alloc] init]

protocolAndClass* c = [[protocolAndClass alloc] init]

protocolAndClass.delegate = t;

1 个答案:

答案 0 :(得分:2)

我不知道“私有协议实施”是什么意思。实现通常是私有的。但是你通过仅在.m中声明test甚至符合<testProtocol>私有这一事实。因此,调用方无法知道test*类型为id<testProtocol>,并且分配不匹配。您可以通过在标头界面中声明<testProtocol>而不是.m私有接口来解决此问题,因为这是您希望调用者知道的内容。你还需要在实现者可以看到它的地方声明协议(目前它在.m中,这使得这是不可能的;我不知道上面的内容可能如何编译)。

注意:ObjC类和协议确实需要以大写字母开头。方法确实需要以小写字母开头。这不仅仅是某人的个人风格; ObjC依赖于某些命名约定,包括大写,以确保正确的行为。所以这应该是这样的:

//Test.h
#import "ProtocolAndClass.h"
@interface Test : NSObject <TestProtocol>
@end

//Test.m
#import "Test.h"

@implementation

- (void)request
{
}
@end

//ProtocolAndClass.h

@protocol TestProtocol <NSObject>
-(void)request;
@end

@interface ProtocolAndClass : NSObject
@property (weak,nonatomic) id<TestProtocol> delegate;
@end


// Top Level Classes
#import Test.h"

Test* t = [[Test alloc] init]
ProtocolAndClass* c = [[ProtocolAndClass alloc] init]
c.delegate = t;