测试已测试 | ✓ |
语言语言 | SwiftSwift |
许可证 | MIT |
发布最后发布 | 2018年1月 |
SwiftSwift 版本 | 4.0 |
SPM支持 SPM | ✓ |
由 incetro 维护。
Transformer 是一个使用 Swift 编写的框架,让您轻松将数据库模型转换为普通对象。
为了支持映射,一个类或结构体只需要实现 Mappable
协议,该协议包括以下功能
init(with resolver: Resolver) throws
class CategoryPlainObject: Mappable {
let id: Int64
let name: String
var positions: [PositionPlainObject] = [] // Array of objects
required init(with resolver: Resolver) throws {
self.id = try resolver.value("id")
self.name = try resolver.value("name")
self.positions = try resolver.value("positions")
}
}
class PositionPlainObject: Mappable {
let id: Int64
let name: String
let price: Double
var category: CategoryPlainObject? = nil // Nested object
required init(with resolver: Resolver) throws {
self.id = try resolver.value("id")
self.name = try resolver.value("name")
self.price = try resolver.value("price")
self.category = try? resolver.value("category")
}
}
struct User: Mappable {
let id: Int64
let name: String
init(with resolver: Resolver) throws {
self.id = try resolver.value("id")
self.name = try resolver.value("name")
}
}
/// A simple protocol for a nice exmaple
protocol Storable: class {
static var entityName: String { get }
}
extension Storable where Self: NSManagedObject {
static var entityName: String {
return NSStringFromClass(self).components(separatedBy: ".").last ?? ""
}
init(in context: NSManagedObjectContext) {
guard let entity = NSEntityDescription.entity(forEntityName: Self.entityName, in: context) else {
fatalError("Cannot create entity for entity name: \(self.entityName)")
}
self.init(entity: entity, insertInto: context)
}
}
class CategoryModelObject: NSManagedObject, Storable {
@NSManaged var id: Int64
@NSManaged var name: String
@NSManaged var positions: NSSet
}
class PositionModelObject: NSManagedObject, Storable {
@NSManaged var id: Int64
@NSManaged var name: String
@NSManaged var price: Double
@NSManaged var category: CategoryModelObject
}
let categoryModelObject = CategoryModelObject(in: context)
let positionModelObject = PositionModelObject(in: context)
/// Fill some data to categoryModelObject & positionModelObject
...
/// And mapping from CoreData objects
let transformer = Transformer(from: .coredata)
let categoryPlainObject: CategoryPlainObject = try transformer.transform(from: categoryModelObject)
let positionPlainObject: PositionPlainObject = try transformer.transform(from: positionModelObject)
如果您不喜欢使用任何依赖管理器,您可以手动将 Transformer 集成到您的项目中。
打开 Terminal,cd
到您的顶级项目目录,并运行以下命令 "if" 您的项目尚未初始化为 git 仓库
$ git init
通过运行以下命令将 Transformer 添加为一个 git 子模块
$ git submodule add https://github.com/incetro/Transformer.git
打开新的 Transformer
目录,并将 Transformer.xcodeproj
拖放到您应用程序 Xcode 项目的 Project Navigator 中。
它应该出现在您应用程序蓝色项目图标之下。它是在所有其他 Xcode 组之上还是之下并不重要。
在 Project Navigator 中选择 Transformer.xcodeproj
并确认部署目标与您的应用程序目标的部署目标匹配。
接下来,在 Project Navigator(蓝色项目图标)中选择您的应用程序项目以导航到目标配置窗口,并在侧边栏的 "Targets" 标题下选择应用程序目标。
在那个窗口的选项卡栏中,打开 "General" 面板。
在 "Embedded Binaries" 部分下方点击 +
按钮。
您将看到两个不同的 Transformer.xcodeproj
目录,每个目录在 "Products" 目录中嵌套了两个不同版本的 Transformer.framework
。
您选择哪个 "Products" 目录并不重要,但您选择的是上半部分的
Transformer.framework
还是下半部分确实很重要。
对于 iOS 选择顶部的 Transformer.framework
,对于 OS X 选择底部的。
您可以通过检查您项目的构建日志来验证您选择了哪个。对于
Transformer
的构建目标是以下之一:Transformer iOS
,Transformer macOS
,Transformer tvOS
或Transformer watchOS
。
就这样了!
Transformer.framework
会自动添加为目标依赖项、链接库和复制文件阶段的嵌入框架,这对于在模拟器和设备上构建是所有您需要的。
incetro,[email protected]
Transformer遵循MIT许可协议。更多信息请参阅LICENSE文件。