objective-c - NSUUID 可以通过继承来扩展吗?如何?

标签 objective-c xcode swift xcode6 nsuuid

最近(审查一些代码)我偶然发现了一个奇怪的现象,它导致我们的程序出现错误。

我们正在使用的 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/

相关文章:

ios - 在 swift 中,一个函数可以是一个类型吗?

ios - 将单元格滚动出 View 后加载行的 UITableView 内容

ios - 在 objective-c 中进行字符串编码

ios - 在不使用来自 iOS 应用程序的任何特定 url 的情况下启动 Safari 应用程序

ios - 如何以编程方式设置 UINavigationbar 的背景颜色?

json - 如何在 Swift 中间接显示给定的 unicode 字符?

ios - didDiscoverPeripheral "fail to build"错误

objective-c - 哪个应用程序有键盘焦点?

ios - 在单元测试代码中访问部署目标

ios - Realm 。更新多个ViewController中的数据