Runtime 是一个 Swift 库,旨在为您提供更多运行时能力,包括获取类型元数据、通过反射设置属性以及为原生 Swift 对象构建类型。
TypeInfo
暴露了关于原生 Swift 结构体、协议、类、元组和枚举的元数据。它捕获属性、泛型类型、继承层级以及更多信息。
假设您有一个 User 结构体
struct User {
let id: Int
let username: String
let email: String
}
要获取 User
的 TypeInfo
,您只需执行以下操作
let info = try typeInfo(of: User.self)
在 TypeInfo
对象中,它包含一个 PropertyInfo
列表,该列表表示该类型的所有属性。PropertyInfo
暴露属性的名称和类型。它还允许获取和设置对象上的值。
使用与之前相同的 User
对象,首先我们获取 TypeInfo
和我们想要的属性。
let info = try typeInfo(of: User.self)
let property = try info.property(named: "username")
获取值
let username = try property.get(from: user)
设置值
try property.set(value: "newUsername", on: &user)
就这么简单!🎉
Runtime 也支持从其 Type
构建对象。结构体和类都支持。
要构建一个 User
对象
let user = try createInstance(type: User.self)
FunctionInfo
暴露了关于函数的元数据。包括参数数量、参数类型、返回类型以及它是否可以抛出错误。
func doSomething(a: Int, b: Bool) throws -> String {
return ""
}
let info = functionInfo(of: doSomething)
问:在获取和设置值时,它是否以无类型方式工作?(即,对象被强制转换为 Any
)
答:是的!整个库的设计都考虑了无类型工作。
问:当创建一个类的新实例时,它是否仍然受 ARC 保护?
答:是的!保留计数已正确设置,以便 ARC 可以完成其工作。
Runtime 可通过 CocoaPods 获取。要安装它,只需将以下行添加到您的 Podfile
pod 'Runtime'
您可以通过 Swift Package Manager 安装 Runtime,只需将以下行添加到您的 Package.swift
import PackageDescription
let package = Package(
[...]
dependencies: [
.Package(url: "https://github.com/wickwirew/Runtime.git", majorVersion: XYZ)
]
)
欢迎并鼓励贡献!
想知道它是如何工作的吗?这是一篇文章,介绍了它是如何实现的。
想了解 Swift 内存布局吗?Mike Ash 做了一个很棒的演讲,内容正是如此。
Runtime 在 MIT 许可证下可用。有关更多信息,请参阅 LICENSE 文件。