
MyVIEw有一个委托,我想在MyVIEwSubclass中覆盖它作为一个子协议,类似于UItableVIEws有一个UItableVIEwDelegate,它也符合超级uiscrollviewdelegate.
我的第一个想法是覆盖超类属性,但这会导致编译器错误,因为子类不能覆盖具有不同类型的超类属性.
// Example throws a compiler error. Can't overrIDe property with different typeclass MyVIEw : UIVIEw { weak var delegate : MyVIEwDelegate?}class MyVIEwSubclass : MyVIEw { overrIDe weak var delegate : MyVIEwSubclassDelegate? // Compiler error}protocol MyVIEwDelegate { func someFunc ()}protocol MyVIEwSubclassDelegate : MyVIEwDelegate { //func someFunc () Edit: redeFinition not necessary,thanks @Rob! func someOtherFunc ()} 我的第二个想法是覆盖委托属性的隐式getter和setter方法.子类可以有一个getter,它接受MyVIEwSubclassDelegate,并转换为MyVIEwDelegate协议,因此不需要重写属性本身.
此方法还会导致编译器错误.访问器实际上不能“覆盖”超类方法,因为它们具有不同的方法签名,并且不能仅因为它们的名称与超类设置器冲突而被声明.
// Example throws a compiler error. Can't declare function with a conflicting nameclass MyVIEwSubclass : MyVIEw { func setDelegate ( newValue : MyVIEwSubclassDelegate ) { // Compiler error super.delegate = newValue as? MyVIEwDelegate } func getDelegate () -> MyVIEwSubclassDelegate { // Compiler error return super.delegate as? MyVIEwSubclassDelegate }} 我可以让子类重写超类的getter和setter,并将委托存储在一个单独的子类属性中,这样做有效,但是当它真正需要分配时,子类看起来应该被分配一个MyVIEwDelegate一个MyVIEwSubclassDelegate,将来可能会造成严重的混乱.
// Example works,but it is unclear that MyVIEwSubclass's delegate should be // assigned a MyVIEwSubclassDelegateclass MyVIEwSubclass : MyVIEw { private weak var _subclassDelegate : MyVIEwSubclassDelegate? overrIDe weak var delegate : MyVIEwDelegate? { // Ambiguous type dIDSet { _subclassDelegate = delegate as? MyVIEwSubclassDelegate } }} 我知道至少类似的东西是可能的,因为像UItableVIEw和UICollectionVIEw这样的类似乎可以做我想要的,但它们也是用Objective-C而不是Swift编写的,所以语言允许的细节可能会有所不同.
有没有办法让Swift子类用子类型覆盖超类的属性?
解决方法 它并不理想,但如果一个协议是从另一个协议继承而不是使用不同的类型,则使用相同的类型,但在dIDSet中实现验证:class MyVIEw : UIVIEw { /// The `MyVIEwDelegate` delegate weak var delegate: MyVIEwDelegate?}class MyVIEwSubclass: MyVIEw { /// The `MyVIEwSubclassDelegate` delegate. /// /// **Note: This must be MyVIEwSubclassDelegate** overrIDe weak var delegate: MyVIEwDelegate? { dIDSet { assert(delegate == nil || delegate is MyVIEwSubclassDelegate,"The delegate of MyVIEwSubclass must be of type `MyVIEwSubclassDelegate`") } }} 它不够优雅,但至少你会立即得到运行时错误,这会将问题引起程序员的注意.通过包含///注释,它也将显示在快速帮助中.
–
或者,您可以采取更激进的更改,例如:类似于ABPeoplePickerNavigationController的delegate和peoplePickerDelegate属性,其中子类委托是通过不同的属性指定的.
总结以上是内存溢出为你收集整理的ios – 覆盖Swift中的超类委托全部内容,希望文章能够帮你解决ios – 覆盖Swift中的超类委托所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)