在swift中更改(细化)委托类型
我有一个(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
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个错误
@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。干杯,伙计