我正在尝试将接口设为私有,它会给我一个警告,即分配给 '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;
答案 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;