Runtime

Swift 5.0 CocoaPods compatible License

Runtime 是一个 Swift 库,旨在为您提供更多运行时能力,包括获取类型元数据、通过反射设置属性以及为原生 Swift 对象构建类型。

TypeInfo

TypeInfo 暴露了关于原生 Swift 结构体、协议、类、元组和枚举的元数据。它捕获属性、泛型类型、继承层级以及更多信息。

示例

假设您有一个 User 结构体

struct User {
  let id: Int
  let username: String
  let email: String
}

要获取 UserTypeInfo,您只需执行以下操作

let info = try typeInfo(of: User.self)

Property Info

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)

就这么简单!🎉

Factory

Runtime 也支持从其 Type 构建对象。结构体和类都支持。

要构建一个 User 对象

let user = try createInstance(type: User.self)

Function Info

FunctionInfo 暴露了关于函数的元数据。包括参数数量、参数类型、返回类型以及它是否可以抛出错误。

示例

func doSomething(a: Int, b: Bool) throws -> String { 
  return "" 
}

let info = functionInfo(of: doSomething)

FAQ

问:在获取和设置值时,它是否以无类型方式工作?(即,对象被强制转换为 Any

答:是的!整个库的设计都考虑了无类型工作。

问:当创建一个类的新实例时,它是否仍然受 ARC 保护?

答:是的!保留计数已正确设置,以便 ARC 可以完成其工作。

安装

Cocoapods

Runtime 可通过 CocoaPods 获取。要安装它,只需将以下行添加到您的 Podfile

pod 'Runtime'

Swift Package Manager

您可以通过 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 文件。