最近(审查一些代码)我偶然发现了一个奇怪的现象,它导致我们的程序出现错误。
我们正在使用的 API 具有以下实现(我将用 Swift 编写,即使原始代码是在 Objective-C 中)
internal class MyUUID: NSUUID { }
这是完全没用的,因为它总是返回一个空实例。
出于解释目的,我将从我的 Playground 上粘贴代码。
例如:创建一个简单的 NSUUID 是这样的:
let a = NSUUID()
a.description //this creates a valid uuid
创建MyUUID应该是类似的
let b = MyUUID()
b.description //it returns an instance, but is completely empty.
但它不起作用。
进一步检查,发现 NSUUID 初始化器创建了一个 __NSConcreteUUID
实例,而 MyUUID 没有,而且无论我尝试做什么,它都不会创建合适的 UUID .
那么,我的问题是:是否可以创建 NSUUID 的子实现?
最佳答案
根据经验,您的证据似乎可以回答您自己的问题:这是不可能的。 NSUUID
看起来是一个类集群而不是单个类,这有效地阻止了子类化。
Aaron 的另一种想法:
实现一个具有 NSUUID
的对象,而不是一个对象。实现 -forwardingTargetForSelector:
并返回您的 NSUUID
实例。考虑重写 -isKindOfClass:
,但除非万不得已,否则最好不要这样做。然后,您应该能够将您的类作为一个 NSUUID
传递给任何期望一个但他们不知道其中差异的人。
鉴于解决方案依赖于内置于动态消息传递中的回退机制,我怀疑没有 Swift 等价物;但是,如果您将类定义为 Objective-C,那么它应该同样适用于 Swift。
关于objective-c - NSUUID 可以通过继承来扩展吗?如何?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26538056/