在其超类也具有相同名称的 ivar 的子类中拥有 ivar“委托”

Posted

技术标签:

【中文标题】在其超类也具有相同名称的 ivar 的子类中拥有 ivar“委托”【英文标题】:Having an ivar 'delegate' in a subclass whose superclass also has same named ivar 【发布时间】:2013-03-31 00:37:40 【问题描述】:

我有一个像这样定义的子类

@protocol UMTextViewDelegate;

@interface UMTexView : UITextView <UITextViewDelegate> 



@property (nonatomic, assign) id<UMTextViewDelegate> delegate;

@end

@protocol UMTextViewDelegate <NSObject>
@optional
- (void)textViewDidSelectWordToDefine:(UMTexView*)textView;
@end

但我收到警告Property type 'id&lt;UMTextViewDelegate&gt;' is incompatible with type 'id&lt;UITextViewDelegate&gt;' inherited from 'UITextView'

如何抑制此警告?我尝试添加这个:

@protocol UMTextViewDelegate <NSObject, UITextViewDelegate>

但没有运气。 !!

编辑:

我没有使用 ARC

【问题讨论】:

【参考方案1】:

您遇到的问题是关于前向声明。在您声明delegate 的地方,编译器不知道UMTextViewDelegateUITextViewDelegate 的后代。它唯一知道的是UMTextViewDelegate 是一个协议。

你必须为类@class UMTexView;创建一个前向声明,然后放置协议声明,然后是类声明。

在单独的注释中,很明显UMTexView 应该是其自身的文本委托。也许让UMTexView 直接从UIView 下降并在其中放入UITextView 会更容易。这样您就不会遇到委托冲突的任何问题,并且 UITextViewDelegate 将无法从外部访问。

【讨论】:

【参考方案2】:

使用@Sulthan 的回答,这就是我想出的,它消除了警告。

@class UMTextView;

@protocol UMTextViewDelegate <NSObject, UITextViewDelegate>
@optional
- (void)textViewDidSelectWordToDefine:(UMTextView*)textView;
@end

@interface UMTextView : UITextView <UITextViewDelegate>

@property (nonatomic, assign) id<UMTextViewDelegate> delegate;

@end

UMTextView 的前向声明后跟协议声明告诉 UMTextView UMTextViewDelegate 确实是 UITextViewDelegate 的后代。这样我就不必添加uiview 然后在该视图中添加uitextview

【讨论】:

以上是关于在其超类也具有相同名称的 ivar 的子类中拥有 ivar“委托”的主要内容,如果未能解决你的问题,请参考以下文章

Java继承方法隐藏(覆盖)

如何用其超类的实例初始化我的子类?

Swift 错误 - 方法不覆盖其超类中的任何方法

当超类也是 Codable 时,如何在子类中使用 CodingKeys?

核心数据继承 - 管理子类的反向关系

Java 继承