【问题标题】:How to instantiate class by name in Swift without using the objective-c runtime如何在 Swift 中按名称实例化类而不使用 Objective-C 运行时
【发布时间】:2017-02-20 18:17:53
【问题描述】:

如果给定类名作为字符串,是否可以创建 Swift 类的实例?这应该适用于所有类,包括用户定义的,而不仅仅是默认类型。

据我了解,这在纯 Swift 中是不可能做到的。由于语言是静态类型的,所有类类型都需要在编译时知道。但是,有几个来源展示了如何使用动态的 Objective-C 运行时来完成此操作。

我的解决方案需要在 Linux 上运行,而现在 Objective-c 运行时不适用于 Linux 上的 Swift。如果传递一个包含类名的字符串,是否可以编写一个 c/c++ 函数来返回一个 Swift 类的实例?还是语言/编译器的设计/结构禁止这样做?

【问题讨论】:

  • 我怀疑这可能是XY problem 的情况。你需要这个做什么?
  • 我们的目标是能够解析包含类型信息的自定义对象表示法,并使用该对象表示法在 Swift 中动态创建类实例。
  • 如果我可能会问,为什么不使用现有的对象序列化技术?
  • 我们希望能够获取一个字符串并自动将其解析为一个类实例供程序员使用。我们正在寻求为端到端 Swift 应用程序构建一个 Web 框架,并且我们正在为该框架创建一个自定义对象表示法。作为对象表示法的一部分,为了方便程序员,我们希望在读入对象表示法文件时自动实例化自定义类。
  • 是否需要使用自定义符号?核心数据、NSArchiver 和许多可用的 ORM 系统完全符合您的描述。

标签: c++ objective-c swift dynamic instantiation


【解决方案1】:

目前这在纯 Swift 中是不可能的。不是因为 Swift 是“静态类型的”,而是因为它还没有实现。当使用 Objective C 运行时(是的,是动态的)来执行此操作时,您需要提供编译器静态类型信息。程序中只有非常有限的部分具有动态行为。从某种意义上说,编译器的一项工作是通过要求您使用显式转换对运行时行为做出编译时断言,从而要求您回到静态类型彩虹和安全蝴蝶的领域。

我可能错了,但我认为没有 C/C++ 解决方法。最终,您需要某种具有所有已加载类知识的运行时系统,可以通过名称进行查询。为此,Swift 依赖于 Objective C 运行时。

反射是 Swift 的一个目标,开发团队表示,他们已经增加了从 Swift 3 开始包含的反射元数据。因为他们致力于提高 Swift 中的反射能力。 Swift 目前正在快速发展,实现 Swift 的团队发现反射对于其他目标(条件一致性、改进的泛型、ABI 稳定性、API 指南标准化等)的优先级较低。

【讨论】:

  • 是的,因为它是“静态类型的”。
  • 此外,问题不是:“很酷的开发人员在 Swift 上工作吗?”或“为什么我们多年来一直在阅读'我们正在努力'?”或“对于不能解决问题的编程语言,什么是好的推广?”
  • 这是什么反应? It is, because it is "statically typed".?
  • "Why do we read 'we are working on it' for years?" 因为这就是目标的优先顺序。不幸的是,生活在资源有限的世界中。
  • ` “对于不能解决问题的编程语言来说,什么是好的推广?”` 这甚至意味着什么?
猜你喜欢
  • 2010-11-13
  • 1970-01-01
  • 2014-07-26
  • 1970-01-01
  • 2018-11-25
  • 2011-01-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多