我想实现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?
}
答案 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
}
}
}