【问题标题】:Override property with different type覆盖不同类型的属性
【发布时间】:2018-08-31 14:40:25
【问题描述】:

我想实现UITableView使用的方法。

我有子类UITableView 和我自己的类FloatingTableView 我想用我的delegate 类型delegate 覆盖UITableView 的delegate FloatingTableViewDelegate 就像UITableView 继承的方式从UIScrollView 并用UITableViewDelegate 覆盖UIScrollViewDelegate 两个类具有名称为delegate 的相同属性,但具有不同的类型。

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

类型为“MyTableViewDelegate?”的属性“delegate”不能覆盖 'UITableViewDelegate?' 类型的属性

这是我的示例代码。

protocol MyTableViewDelegate: UITableViewDelegate {
    func isDemoDelegateMethod()
}

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

【问题讨论】:

标签: ios swift uitableview delegates


【解决方案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
        }

   }
}

【讨论】:

  • tableview 在做什么?
  • 所以这种方法在Swift是不可能的?
  • UITableView 是怎么做到的?
  • 我告诉过你 UITableView 这样做是因为 Objective C 是语言的本质。用 Objective C 查看上面的 MyTableView,这对 ObjC 完全有效。不是 Swift
  • 我赞成你的答案,因为你为我提供了一个想法,以在Swifty-Objc 方法中实现上述目标。
猜你喜欢
  • 2019-09-29
  • 2019-06-12
  • 2018-07-26
  • 2013-04-05
  • 2011-03-09
  • 2014-12-13
  • 2020-04-03
  • 1970-01-01
相关资源
最近更新 更多