我想实现UITableView
使用的方法。
我有自己的类的子类UITableView
FloatingTableView
我想覆盖UITableView
的delegate
,这与我的delegate
FloatingTableViewDelegate
UITableViewDelegate
,就像UITableView
从UIScrollView
继承并覆盖UIScrollViewDelegate
的方式一样UITableViewDelegate
两个类具有相同的属性,名称delegate
但具有不同的类型。
我也试图继承我的协议与UITableViewDelegate
但是当我尝试创建名称delegate
类型为 FloatingTableViewDelegate
的属性时,我收到此错误。
类型为"MyTableViewDelegate?"的属性"委托"不能覆盖 类型为"UITableViewDelegate?">
这是我的示例代码。
protocol MyTableViewDelegate: UITableViewDelegate {
func isDemoDelegateMethod()
}
class MyTableView: UITableView {
weak var delegate: MyTableViewDelegate?
}
它对Objective C的工作方式是因为语言的动态性质。您可以重新声明超类的类型,而不是合成属性,而是将其设置为动态类型,这样您就可以重新声明它。
@protocol MyTableViewDelegate<UITableViewDelegate>
- (void)demoDelegateMethod;
@end
@interface WrapperTableView: UITableView
@property (nonatomic, weak, nullable) id <MyTableViewDelegate> delegate;
@end
@implementation WrapperTableView
@dynamic delegate;
@end
但是,我怀疑这在 Swift 中是否可行,因为您正在完全更改类型。这是因为 Swift 是强大的静态语言。
答案已编辑
我明白你的方法。我在Objective-C
中编写了上述方法,然后在Swift
继承了这个类。因此,如果我必须使用不同类型的 SuperClass 属性重写,我需要创建一个包装类Objective-C
从所需的SuperClass
继承,然后最后不是直接从所需的超类继承,我应该从新创建的WrapperClass
继承,这是用Objective-C
class MyTableView: WrapperTableView {
//Now Here the delegate object is of type MyTableViewDelegate
}
这种方法要好得多
class MyTableView: UITableView {
private var myDelegate: MyTableViewDelegate?
override var delegate: UITableViewDelegate {
set{
myDelegate = newValue
}
get{
return myDelegate
}
}
}