在swift中更改(细化)委托类型

在swift中更改(细化)委托类型,swift,delegates,protocols,delegation,Swift,Delegates,Protocols,Delegation,我有一个(swift)类,它有一个指向委托的弱指针,如下所示: import UIKit @objc public protocol DRSlidingPanelViewControllerDelegate : class { optional func didSlidePanel(panelHidden : Bool , sender : DRSlidingPanelViewController) -> Void } public class DRSlidingPan

我有一个(swift)类,它有一个指向委托的弱指针,如下所示:

import UIKit


@objc public protocol DRSlidingPanelViewControllerDelegate : class {

    optional func didSlidePanel(panelHidden : Bool , sender : DRSlidingPanelViewController) -> Void

} 

public class DRSlidingPanelViewController: UIViewController {

    public weak var delegate : DRSlidingPanelViewControllerDelegate?

///other stuff...
}
现在,我用另一个协议创建了一个子类,该协议扩展了第一个协议,我想修改继承的'delegate'属性

@objc public protocol  DRTableViewControllerDelegate : DRSlidingPanelViewControllerDelegate  {

    optional func someFunction(sender : DRTableViewController) -> Void
}


public class DRTableViewController: DRSlidingPanelViewController {

 //  public weak var delegate : DRTableViewControllerDelegate?
}
^子类中委托的这个(重新)声明在我取消注释它时给了我3个错误

  • 类型为“DRTableViewControllerDelegate?”(也称为“可选”)的属性“delegate”无法重写类型为“DRSlidingPanelViewControllerDelegate?”(也称为“可选”)的属性
  • 具有Objective-C选择器的“delegate”的Getter与具有相同Objective-C选择器的超类“DRSlidingPanelViewController”中的“delegate”的Getter冲突
  • 具有Objective-C选择器“setDelegate:”的“delegate”的Setter与具有相同Objective-C选择器的超类“DRSlidingPanelViewController”中的“delegate”的Setter冲突
  • 现在我了解了这些错误的性质,它们是一个错误的不同方面(试图更改委托指针上的“类型”)。有人能给我一个如何做的线索吗?这显然是可以做到的,看看UITableView是如何改变它从UIScrollView继承的委托指针的。在objC中,我会得到一个警告,该警告可以用@dynamic来消音。 谢谢并致以最良好的问候

    编辑/添加 谢谢Matt,我确实看到了上一个问题,但不幸的是,这个问题已经结束了,我个人不会接受这个答案作为最终答案,因为这是一个妥协

    如果我在xCode中右键单击UITableView并“跳转到定义”,我会看到这个

    @available(iOS 2.0, *)
    public class UITableView : UIScrollView, NSCoding {
    
        public init(frame: CGRect, style: UITableViewStyle) // must specify style at creation. -initWithFrame: calls this with UITableViewStylePlain
        public init?(coder aDecoder: NSCoder)
    
        public var style: UITableViewStyle { get }
        weak public var dataSource: UITableViewDataSource?
        **weak public var delegate: UITableViewDelegate?**
    
    //plenty other stuff..
    }
    

    因此,我恭敬地表示,肯定有办法做到这一点。

    我想说,就目前情况而言,你无法做到这一点。至少可以说,这是令人失望的。您只需调用子类中的委托变量即可

    因此,这是合法的,但当然完全不能满足您的要求:

    @objc protocol P1 {
    }
    @objc protocol P2 : P1 {
    }
    public class VC1: UIViewController {
        weak var delegate : P1?
    }
    public class VC2: VC1 {
        weak var delegate2 : P2?
    }
    
    如果您真的讨厌存储乘法,可以将
    delegate2
    作为一个计算变量,用于访问继承的
    delegate

    @objc protocol P1 {
    }
    @objc protocol P2 : P1 {
    }
    public class VC1: UIViewController {
        weak var delegate : P1?
    }
    public class VC2: VC1 {
        weak var delegate2 : P2? {
            set {
                super.delegate = newValue
            }
            get {
                return super.delegate as? P2
            }
        }
    }
    

    这里已经讲得很清楚了:这绝对是个问题!这里也有有趣的讨论:是的,但是底层代码是用Objective-C编写的。您只需要看一个Swift API翻译。所以你不能用斯威夫特,这就是我要说的。我很想犯错,但我不认为我错了……我真的很感谢你的意见,但我会给你一个+1而不是一个接受,因为我知道有办法。我仍然是一个粉丝,尽管我看到了另一个折衷方案,我可以将我的DRTableViewControllerDelegate协议更改为DRSlidingPanelViewControllerDelegate上的扩展,但我认为这将迫使我只使用可选功能。你完全有理由不接受!这是个坏消息,但我不相信有办法;看看我给你的链接。看来我们已经在这条路上走来走去了(见我修改后的答案;没有什么好的,但有点可爱。我确实喜欢这样,并且也在想类似的事情——但是是私有的,只读的,只是一个有条件地键入现有代理指针的getter。干杯,伙计