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。
在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 的优秀
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。