Objective c 重写符合协议的属性

Objective c 重写符合协议的属性,objective-c,cocoa-touch,llvm,Objective C,Cocoa Touch,Llvm,在使用LLVM编译器2.0时,我似乎遇到了一个新的错误,这是我以前没有遇到过的 我有一个协议,称为: @协议DTGridViewDelegate 我有一个名为(UIScrollView的子类,它本身有一个委托属性)的属性。其定义如下: @属性(非原子,赋值)IBOutlet id委托 现在我得到的信息是: DTGridView.h:116:63:错误:属性类型“id”与从“UIScrollView”继承的类型“id”不兼容。 因为我说过DTGridViewDelegate符合UIScrollVi

在使用LLVM编译器2.0时,我似乎遇到了一个新的错误,这是我以前没有遇到过的

我有一个协议,称为:

@协议DTGridViewDelegate

我有一个名为(UIScrollView的子类,它本身有一个
委托
属性)的属性。其定义如下:

@属性(非原子,赋值)IBOutlet id委托

现在我得到的信息是:

DTGridView.h:116:63:错误:属性类型“id”与从“UIScrollView”继承的类型“id”不兼容。

因为我说过DTGridViewDelegate符合UIScrollViewDelegate,所以我认为用这种方式重写这个属性是可以的,事实上,这是第一个表明存在问题的编译器

我已通过如下方式声明属性来修复错误:

@属性(非原子,赋值)IBOutlet id委托


我想知道这是否是编译器的问题?

因为没有正式的Objective-C语言规范,所以无法确定编译器是否正常运行。我们所能说的是,苹果的gcc似乎对上述场景没有问题,尽管它在概念上是不合理的,因为它可能会中断,
delegate
是从
UIScrollView
DTGridView
(尽管协方差也是一个问题)。如果将
DTGridView
传递给需要
UIScrollView
的代码,会发生什么情况,然后将
delegate
设置为符合
UIScrollViewDelegate
但不符合
DTGridViewDelegate

的对象。您的设置看起来与从UIScrollView继承UITableView时使用的设置相同。UITableViewDelegate协议继承自UIScrollViewDelegate协议

我设置了以下内容,可以很好地编译:

// .h
@protocol ParentClassDelegate
-(NSString *) aDelegateMethod;
@end

@interface ParentClass : NSObject {
    id delegate;
}
@property(nonatomic, assign) IBOutlet id <ParentClassDelegate> delegate;
@end

//.m
@implementation ParentClass
@synthesize delegate;

-(id) delegate{
    return @"Parent delegate";
}//-------------------------------------(id) delegate------------------------------------

-(void) setDelegate:(id)someObj{
    delegate=someObj;
}//-------------------------------------(id) setDelegate------------------------------------
@end

//.h
@protocol ChildClassDelegate <ParentClassDelegate>
-(NSArray *) anotherDelegateMethod;
@end

@interface ChildClass : ParentClass{
}
@property(nonatomic, retain) IBOutlet id <ChildClassDelegate> delegate;
@end

//.m
@implementation ChildClass
//@synthesize delegate;

-(id) delegate{
    return @"childDelegate";
}//-------------------------------------(id) delegate------------------------------------

-(void) setDelegate:(id)someObj{
    delegate=someObj;
}//-------------------------------------(id) setDelegate------------------------------------

@end
/.h
@协议父类委托
-(NSString*)一种等效方法;
@结束
@接口父类:NSObject{
id代表;
}
@属性(非原子,赋值)IBID委托;
@结束
//m
@实现父类
@综合代表;
-(id)代表{
返回@“父委托”;
}//-------------------------------------(id)代表------------------------------------
-(void)setDelegate:(id)someObj{
委托=某个对象;
}//-------------------------------------(id)setDelegate------------------------------------
@结束
//h
@协议子类委托
-(NSArray*)另一种委派方法;
@结束
@接口子类:父类{
}
@属性(非原子,保留)IBID委托;
@结束
//m
@实现子类
//@综合代表;
-(id)代表{
返回@“childDelegate”;
}//-------------------------------------(id)代表------------------------------------
-(void)setDelegate:(id)someObj{
委托=某个对象;
}//-------------------------------------(id)setDelegate------------------------------------
@结束
不确定是什么导致了你的问题。我注意到,在标题中,UITableViewDelegate协议如下所示:

@protocol UITableViewDelegate<NSObject, UIScrollViewDelegate>
@协议UITableViewDelegate
。。。因此,编译器有时可能喜欢更明确的东西


我建议你做一个干净整洁的发型。这解决了很多问题

我在这里使用Wolf的脚本打开了更严格的警告:。这可能解释了为什么您没有看到警告/错误。不过,您完全正确,我忘记了UITableViewDelegate,这是我首先根据代码编写的!在我看来,第一种方法不应该为此提出警告。另外,我觉得奇怪的是,UITableViewDelegate说它符合NSObject,同时它也符合UIScrollViewDelegate,而UIScrollViewDelegate本身也符合NSObject。因此在与@MikeAbdullah进一步讨论之后,我发现我需要将协议声明放在类接口之前。当编译器到达我的属性声明时,@protocol DTGridViewDelegate并没有说它符合。我终于破解并开始尝试修复它,瞧,问题昨天就解决了!丹尼尔-期待修复出现在您的存储库中:)这是完全正确的。我发现奇怪的是,在我声明委托的两种方式中,这都会如您所描述的那样中断,但编译器只针对其中一种发出警告。