gpt4 book ai didi

objective-c - 如何在 Objective-C 中正确地子类化委托(delegate)属性?

转载 作者:太空狗 更新时间:2023-10-30 03:27:55 25 4
gpt4 key购买 nike

在对类进行子类化时,我还想对父类的委托(delegate)进行子类化,因为子类现在具有附加功能。执行此操作的最佳方法是什么?如果我只是在子类中声明另一个具有相同名称的委托(delegate)属性,我会收到警告“属性类型‘id’与从‘ParentClass’继承的类型‘id’不兼容

最佳答案

给出这个产生警告的例子:

// Class A
@protocol ClassADelegete;

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

@protocol ClassADelegete <NSObject>
- (void)classADidSomethingInteresting:(ClassA *)classA;
@end

// Class B
@protocol ClassBDelegete;

@interface ClassB : ClassA
@property (nonatomic, weak) id<ClassBDelegete> delegate; // Warning here
@end

@protocol ClassBDelegete <ClassADelegete>
- (void)classBDidSomethingElse:(ClassB *)classB;
@end

消除警告的两种解决方案是。

1) 在子类中,将协议(protocol)定义放在类定义之前。这是 UITableView.h 中的 UITableViewDelegate 所做的:

// Class B
@class ClassB;

@protocol ClassBDelegete <ClassADelegete>
- (void)classBDidSomethingElse:(ClassB *)classB;
@end

@interface ClassB : ClassA
@property (nonatomic, weak) id<ClassBDelegete> delegate;
@end

2) 在子类中,将原始协议(protocol)添加到新协议(protocol)旁边:

// Class B
@protocol ClassBDelegete;

@interface ClassB : ClassA
@property (nonatomic, weak) id<ClassADelegete, ClassBDelegete> delegate;
@end

@protocol ClassBDelegete <ClassADelegete>
- (void)classBDidSomethingElse:(ClassB *)classB;
@end

我假设 (1) 像 Apple 那样工作,选项 (2) 删除了警告,但我没有以这种方式编译和运行任何设置。

关于objective-c - 如何在 Objective-C 中正确地子类化委托(delegate)属性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9765033/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com