不能将DispatchGroup子类化 - “只能通过Objective-C运行时可见”?

时间:2016-12-18 16:49:17

标签: swift swift3 objective-c-runtime

不可能继承DispatchGroup,怎么做?

注意:

最终在iOS 10 +

中修复了这个问题

示例,带有一个有状态的包,

class PushDispatchGroup: DispatchGroup {
    var sentIds: [(tableName: String, rowId: String)] = []
}

感谢shallowThought指出这是在iOS10中修复的。

1 个答案:

答案 0 :(得分:4)

  

如何从“只能通过Objective-C运行时可见”的类继承?

你没有。

这并不像你正在思考它的方式那样包裹着一个合适的“对象”。它围绕着dispatch_group,这是一个C结构。这个类不是设计为子类,也不是以正常的方式连接到ObjC,因此你也不能将它子类化。

直接桥接到低级C类型的“对象”通常具有非常不寻常的结构,系统的某些部分是硬编码的,以便知道如何处理(这种情况一直发生在像{{1}这样的免费桥接上和NSString)。在许多情况下,通过仔细选择结构,类型被设计为在内存布局上相同(我没有选择CFString,但它看起来像这个组中的一个)。当这是真的,你不能添加任何存储,因为那时内存布局会有所不同,你就会打破桥接。

正如各个评论者所说,你也不应该这样做,这就是为什么 没有简单的答案。未明确设计用于子类化的类有意或很难在Swift中进行子类化(这经常出现在比DispatchGroup更少的棘手类型中,答案是相同的:它是有意的;不要这样做)。