Swift: 运行时获取模块?

Swift: obtain module at runtime?

在Swift中,在运行时,是否可以知道模块代码的名称是运行中的?

我想要类似的东西(这完全是虚构的代码)

let moduleName: String = CompileTimeInfo.moduleName

Related.

您可以利用模块名称用作命名空间这一事实,并且 debugPrint 类型将以模块名称为前缀:

enum Test {}
var string: String = ""
debugPrint(Test.self, to: &string)     
print("Module name: \(string.split(separator: ".").first ?? "")")

注意:类型必须在实际模块中定义。因此,将前三行包装成一个函数和 return 模块名称,完成。

借鉴@CouchDeveloper 的优秀,您可以获得任意Swift 类型 的模块名称。您可以使用它来获取任意代码的模块名称,为此目的创建一个类型。

func moduleName(for type: Any.Type) -> String {
  // parse module name from string that looks like "ModuleName.ClassName"
  if let subSequence = String(reflecting: type.self).split(separator: ".").first {
    return String(subSequence)
  } else {
    return ""
  }
}

print(moduleName(for: String.self)) // -> Swift

enum Test {}
print(moduleName(for: Test.self))   // -> SwiftModuleNameExample

这甚至可以嵌入到协议中。

public protocol Module {}
extension Module {
  static var name: String { moduleName(for: Self.self) }
}

class ThisModule: Module {}

print(ThisModule.name)             // -> SwiftModuleNameExample

此代码的 macOS 命令行 Xcode 项目存在 here