Reflex 是一个使用 Swift 编写的框架,使您能够轻松地反射 Swift 对象
// MARK: - Human
class Human {
let name: String
let age: Int
init(name: String, age: Int) {
self.name = name
self.age = age
}
}
// MARK: - Post
enum Post {
case manager
case programmer
case designer
}
// MARK: - Project
struct Project {
let name: String
}
// MARK: - Employee
class Employee: Human {
let post: Post
init(name: String, age: Int, post: Post) {
self.post = post
super.init(name: name, age: age)
}
}
// MARK: - Manager
class Manager: Employee {
let projects: [Project]
init(name: String, age: Int, projects: Project...) {
self.projects = projects
super.init(name: name, age: age, post: .manager)
}
}
let project = Project(name: "Reflex")
let manager = Manager(name: "Joe", age: 21, projects: project)
let reflection = Reflector.reflect(from: manager)
reflection.isArray // false
reflection.isClass // true
reflection.isStruct // false
reflection.isSet // false
reflection.isOptional // false
reflection.isDictionary // false
reflection.isEnum // false
reflection.name // ReflectorTests.Manager
reflection.shortName // Manager
reflection.valueType == .class(named: "Manager") // true
reflection.valueType == .array(of: .int) // false
// MARK: - AncestorsRequirements
public enum AncestorsRequirements {
case disabled
case all
case level(of: Int)
}
.all
let project = Project(name: "Reflex")
let manager = Manager(name: "Joe", age: 21, projects: project)
/// Reflector collects all properties from all hierarchy (Manager -> Employee -> Human)
let reflection = Reflector.reflect(from: manager, withAncestorsRequirements: .all)
reflection.childrenCount // 4
reflection.names // ["projects", "post", "name", "age"]
reflection.values // ["name": "Joe", "projects": [Project(name: "Reflex")], "post": Post.manager, "age": 21]
reflection.types // ["Array<custom<Project>>", "enum<Post>", "String", "Int"]
.level(of: Int)
let project = Project(name: "Reflex")
let manager = Manager(name: "Joe", age: 21, projects: project)
/// Reflector collects all properties from 2 classes (Manager -> Employee)
let reflection = Reflector.reflect(from: manager, withAncestorsRequirements: .level(of: 2))
reflection.childrenCount // 2
reflection.names // ["projects", "post"]
reflection.values // [[Project(name: "Reflex")], Post.manager]
reflection.types // ["Array<custom<Project>>", "enum<Post>"]
.disabled
let project = Project(name: "Reflex")
let manager = Manager(name: "Joe", age: 21, projects: project)
/// Reflector collects all properties from the given class (Manager)
let reflection = Reflector.reflect(from: manager) // .disabled by default
reflection.childrenCount // 1
reflection.names // ["projects"]
reflection.values // [[Project(name: "Reflex")]]
reflection.types // ["Array<custom<Project>>"]
let project = Project(name: "Reflex")
let manager = Manager(name: "Joe", age: 21, projects: project)
let reflection = Reflector.reflect(from: manager, withAncestorsRequirements: .all)
reflection["name"] // "Joe"
reflection["age"] // 21
let project = Project(name: "Reflex")
let manager = Manager(name: "Joe", age: 21, projects: project)
let reflection = Reflector.reflect(from: manager, withAncestorsRequirements: .all)
guard let enumReflection = reflection.children("post") else {
return // if cannot get children with name "post"
}
enumReflection.isEnum // true
enumReflection.valueType == .enum(named: "Post") // true
let array = [[0, 1, 2], [3, 4, 5]]
let reflection = Reflector.reflect(from: array)
reflection.isArray // true
reflection.type // Array<Array<Int>>
reflection.valueType == .array(of: .array(of: .int)) // true
let dictionary: [String: Manager] = ["Andrew" : manager]
let reflection = Reflector.reflect(from: dictionary)
reflection.isDictionary // true
reflection.type // Dictionary<String, class<Manager>>
reflection.valueType == .dictionary(key: .string, value: .class(named: "Manager")) // true
let set: Set<Int> = [0, 1, 2, 3, 4]
let reflection = Reflector.reflect(from: set)
reflection.isSet // true
reflection.type // Set<Int>
reflection.valueType == .set(of: .int) // true
如果您喜欢不使用任何依赖管理器,可以将 Reflex 手动集成到您的项目中。
打开终端,cd
进入您的顶级项目目录,并运行以下命令 "if" 您的项目尚未初始化为 Git 仓库
$ git init
通过运行以下命令将 Reflex 添加为 Git 子模块
$ git submodule add https://github.com/incetro/Reflex.git
打开新的 Reflex
文件夹,并将 Reflex.xcodeproj
拖动到您应用程序的 Xcode 项目的项目导航器中。
它应该出现在应用程序蓝色项目图标下面的嵌套中。它是在所有其他 Xcode 组之上还是之下并不重要。
在项目导航器中选择 Reflex.xcodeproj
,并验证部署目标与您的应用程序目标相匹配。
然后,在项目导航器中(蓝色项目图标)选择您的应用程序项目,导航到目标配置窗口,在侧边栏的 "Targets" 下选择应用程序目标。
在那个窗口的顶部选项卡栏中,打开 "General" 面板。
在 "Embedded Binaries" 部分下方单击 +
按钮。
您将看到两个不同的 Reflex.xcodeproj
文件夹,每个文件夹中都有一个嵌套在 "Products" 文件夹中的两个不同版本的 Reflex.framework
。
选择哪个《产品》文件夹无关紧要,但是您选择的《Reflex.framework》是顶部的还是底部的则很重要。
请为iOS选择顶部的《Reflex.framework》,为OS X选择底部的。
您可以通过检查项目的构建日志来验证您选择了哪个。对于《Reflex》的构建目标会列出为《Reflex iOS》、《Reflex macOS》、《Reflex tvOS》或《Reflex watchOS》。
就这些了!
Reflex.framework
将自动添加为目标依赖项、链接框架和嵌入框架,这是在发布文件阶段所需的所有内容,以在模拟器和设备上构建。
incetro, [email protected]
《Reflex》根据MIT许可证提供。有关更多信息,请参阅LICENSE文件。