如何在不使用 objective-c 运行时的情况下在 Swift 中按名称实例化 class

How to instantiate class by name in Swift without using the objective-c runtime

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

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

我的解决方案需要在 Linux 上 运行,现在 objective-c 运行 时间无法用于 [=29= 上的 Swift ].如果传递包含 class 名称的字符串,是否可以编写一个 c/c++ 函数来 return Swift class 的实例?还是 language/compiler 的 design/structure 禁止这个?

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

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

反射是 Swift 的一个目标,并且开发团队表示他们已经增加了自 Swift 3 起包含的反射元数据。随着他们努力提高反射能力在 Swift。 Swift 目前正在快速发展,实施 Swift 的团队发现反思的优先级低于其他目标(条件一致性、改进的通用性、ABI 稳定性、API 指南标准化等) .).