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)
就是这样简单!
工厂
运行时还支持从其类型
构建对象。支持struct和class。
构建一个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才能完成其工作。
安装
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 文件。