覆盖具有不同类型的超类属性

Jon*_*esy 8 syntax ios swift

以下代码抛出错误

protocol WhatA: AnyObject {
    func doThat()
}

protocol WhatB: WhatA {
    func doThis()
}

class SomethingA {
    weak var delegate: WhatA?
}

class SomethingB: SomethingA {
    weak var delegate: WhatB?
}
Run Code Online (Sandbox Code Playgroud)

类型为“ WhatB?”的属性“委托” 无法覆盖类型为“ WhatA?”的属性

UIKit在以下方面没有问题

open class UIScrollView : UIView, NSCoding, UIFocusItemScrollableContainer {

    weak open var delegate: UIScrollViewDelegate?

}

open class UITableView : UIScrollView, NSCoding, UIDataSourceTranslating {

    weak open var delegate: UITableViewDelegate?

}
Run Code Online (Sandbox Code Playgroud)

为什么这在UIKit中起作用?这个问题的公认答案表明这是不可能的。

rma*_*ddy 8

它与UIScrollViewUITableView及其代表一起使用的原因是它们是从原始Objective-C标头生成的Swift接口。

使用Objective-C可以做到这一点。虽然您不能创建直接执行此操作的Swift类,但在这里看到的情况是从Objective-C桥接标头生成的Swift类接口可能会导致。

  • 添加@TylerTheCompiler提供的链接以注释以完成https://forums.swift.org/t/in-a-sub-class-is-it-possible-to-override-a-property-of-the-super类并限制原始属性的一种子类型/ 10747/5 (3认同)