覆盖不同类型的属性

时间:2018-03-22 08:36:15

标签: ios swift uitableview delegates

我想实现UITableView使用的方法。

我的子类UITableView包含我自己的班级FloatingTableView我想覆盖delegate的{​​{1}} UITableView UITableViewDelegate和我的delegate FloatingTableViewDelegate类型的UITableView只是从UIScrollView继承的方式,并使用UIScrollViewDelegate覆盖UITableViewDelegate这两个类具有名称为delegate的相同属性但具有不同类型。

我还试图用UITableViewDelegate继承我的协议 但是当我尝试创建名为delegate FloatingTableViewDelegate类型的属性时,我收到此错误..

  

财产'代表'使用类型' MyTableViewDelegate?'不能覆盖一个   类型为' UITableViewDelegate?'

的属性

以下是我的示例代码。

protocol MyTableViewDelegate: UITableViewDelegate {
    func isDemoDelegateMethod()
}

class MyTableView: UITableView {
    weak var delegate: MyTableViewDelegate?
}

1 个答案:

答案 0 :(得分:1)

它对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
        }

   }
}