【问题标题】:Swift 3: Xcode claims that a non-generic class is genericSwift 3:Xcode 声称非泛型类是泛型的
【发布时间】:2016-10-20 01:35:23
【问题描述】:

转换为 Swift 3 后,我遇到了 Obj-C 的可见性问题(Interface Builder 在运行时找不到控制器类)。于是我加了@objc去调试:

@objc(ASSitesTableViewController)
class ASSitesTableViewController : GenericFRCTableVC<Site>

然后 Xcode 回吐:

'@objc' 类的通用子类不能具有显式的 '@objc' 属性,因为它们在 Objective-C 中不直接可见

但是这个类并不是真正的通用。它只继承自一个已专门化的类。

我知道子类化一个专门的类型是一个很长的尝试,因为它在早期版本的 Swift 中不受支持,但它编译时没有任何抱怨。我没想到我的班级会保持通用。

我发现在 Swift 文档的继承部分没有提到泛型,反之亦然。

基类是否必须是非泛型的,子类才能对 Obj-C 可见?

【问题讨论】:

    标签: ios generics swift3


    【解决方案1】:

    基类是否必须是非泛型的,子类才能对 Obj-C 可见?

    是的。子类本身在其定义中没有通用占位符,但子类“是”它的超类。狗“是”四足动物(如果狗是四足动物的子类)。所以这个类“是”GenericFRCTableVC&lt;Site&gt;。好吧,Objective-C 无法识别GenericFRCTableVC&lt;Site&gt;,因此它无法识别 ASSitesTableViewController。

    转换为 Swift 3 后

    我想你会发现在早期版本的 Swift 中你也会遇到同样的问题。我不认为这与转换为 Swift 3 有任何关系。

    【讨论】:

    • 感谢您的确认。更大的问题是 Swift 3 引起的,因为 FRC(获取的结果控制器)在那个版本中是通用的,我试图沿链向下传播,但没有成功。
    • 我知道 - 我在使用新的进口仿制药时遇到了很多困难。但是,请记住,导入的泛型在参数化类型上是协变的。这在很多情况下都有帮助。
    • 全部?听起来更像是破坏类型安全而不是功能,但我找不到该行为的文档。我认为普通数组在 Swift 2 之前也是如此。youtu.be/n9yAJfYjcl4?t=39m6s
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-02-15
    • 1970-01-01
    • 1970-01-01
    • 2021-02-16
    • 2010-10-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多