Objective c 重写符合协议的属性
在使用LLVM编译器2.0时,我似乎遇到了一个新的错误,这是我以前没有遇到过的 我有一个协议,称为: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
@协议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并没有说它符合。我终于破解并开始尝试修复它,瞧,问题昨天就解决了!丹尼尔-期待修复出现在您的存储库中:)这是完全正确的。我发现奇怪的是,在我声明委托的两种方式中,这都会如您所描述的那样中断,但编译器只针对其中一种发出警告。