使用不同类型的属性重写属性



我想实现UITableView使用的方法。

我有自己的类的子类UITableView FloatingTableView我想覆盖UITableViewdelegate,这与我的delegate FloatingTableViewDelegate UITableViewDelegate,就像UITableViewUIScrollView继承并覆盖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
        }
   }
}

最新更新