Runtime 是一个 Swift 库,为您提供更多的运行时能力,包括获取类型元数据、通过反射设置属性以及对原生 Swift 对象进行类型构造。
TypeInfo
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)
就这么简单!
工厂
运行时还支持从其类型
构建对象。支持结构和类。
要构建一个User
对象
let user = try createInstance(type: User.self)
函数信息
FunctionInfo
公开有关函数的元数据。包括参数数量、参数类型、返回类型以及是否会抛出错误。
示例
func doSomething(a: Int, b: Bool) throws -> String {
return ""
}
let info = functionInfo(of: doSomething)
常见问题解答
Q:在获取和设置值的时候,是否是无类型操作?(即对象被转换为Any
类型)
A:是的!整个库都是设计为支持无类型操作的。
Q:创建类的新实例时是否仍然受到自动引用计数(ARC)的保护?
A:是的!引用计数被设置为正确的值,以便自动引用计数(ARC)可以执行其工作。
安装
Cocoapods
运行时通过Cocoapods提供。要安装它,只需将以下行添加到您的Podfile中
pod 'Runtime'
Swift 包管理器
您可以通过添加以下行到您的 Package.swift
文件来使用 Swift 包管理器 安装运行时:
import PackageDescription
let package = Package(
[...]
dependencies: [
.Package(url: "https://github.com/wickwirew/Runtime.git", majorVersion: XYZ)
]
)
贡献
欢迎并鼓励贡献!
了解
想了解它是如何工作的?这里有关于它是如何实现的文章。
想了解 Swift 内存布局?Mike Ash 有关于此的精彩讲话。
许可证
运行时在 MIT 许可证下可用。有关更多信息,请参阅 LICENSE 文件。