Reflex 1.0.7

Reflex 1.0.7

测试已测试
语言语言 SwiftSwift
许可证 MIT
发布上次发布2018年1月
SwiftSwift 版本4.0
SPM支持 SPM

incetro 维护。



Reflex 1.0.7

  • 作者
  • incetro





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

您可以使用按名称作为 Reflection 的子级反射

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

要求

  • iOS 8.0+ / macOS 10.9+ / tvOS 9.0+ / watchOS 2.0+
  • Xcode 8.1, 8.2, 8.3 和 9.0
  • Swift 3.0, 3.1, 3.2 和 4.0

通信

  • 如果您 发现了错误,请提交一个问题。
  • 如果您 有特性请求,请提交一个问题。
  • 如果您 想贡献,请提交拉取请求。

安装

手动

如果您喜欢不使用任何依赖管理器,可以将 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文件。