【问题标题】:Overriding superclass property with different type覆盖不同类型的超类属性
【发布时间】:2019-09-29 11:20:17
【问题描述】:

以下代码抛出错误

protocol WhatA: AnyObject {
    func doThat()
}

protocol WhatB: WhatA {
    func doThis()
}

class SomethingA {
    weak var delegate: WhatA?
}

class SomethingB: SomethingA {
    weak var delegate: WhatB?
}

类型为“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?

}

为什么这在 UIKit 中有效? this 问题的公认答案表明这是不可能的。

【问题讨论】:

  • 你不能在 UIKit 中覆盖,你可以再试一次
  • @AhemadabbasVagh 你能澄清你的评论吗?
  • 我建议在这里阅读这个主题:forums.swift.org/t/…。 TL;DR:这是不安全的 Objective-C 魔法,你不能在 Swift 中做到。
  • 感谢@TylerTheCompiler 将接受如果作出官方回答。
  • 谢谢,但我不想将其作为答案发布,因为它只是一个链接。 @rmaddy 的回答实际上解释了它,这更好。

标签: ios swift syntax


【解决方案1】:

它与 UIScrollViewUITableView 以及它们的委托一起工作的原因是它们是从原始 Objective-C 标头生成的 Swift 接口。

Objective-C 允许您这样做。虽然您无法创建直接执行此操作的 Swift 类,但从 Objective-C 桥接头生成的 Swift 类接口可能会导致您在此处看到的情况。

【讨论】:

猜你喜欢
  • 2018-08-31
  • 2020-04-03
  • 2014-10-19
  • 2019-06-12
  • 1970-01-01
  • 2018-07-26
  • 1970-01-01
  • 2013-04-05
相关资源
最近更新 更多