isa = PBXGroup;
children = (
F47C3E971E5DB29300D97449 /* JSONMapper.swift */,
- F47C3E991E5DC90000D97449 /* MasterSTypeMapper.swift */,
+ F47C3EBB1E61AEC500D97449 /* AirBaseMapper.swift */,
+ F47C3EB51E60766000D97449 /* BasicMapper.swift */,
+ F47C3EAD1E5F26E900D97449 /* DeckMapper.swift */,
+ F47C3EB91E619CC400D97449 /* KenzoDockMapper.swift */,
F47C3EA31E5F017500D97449 /* MasterFurnitureMapper.swift */,
- F47C3E9B1E5DC94E00D97449 /* MasterShipMapper.swift */,
F47C3E9D1E5DD3E400D97449 /* MasterMapAreaMapper.swift */,
F47C3E9F1E5DE08F00D97449 /* MasterMapInfoMapper.swift */,
- F47C3EA11E5EFCC800D97449 /* MasterUseItemMapper.swift */,
- F47C3EA51E5F050D00D97449 /* MasterSlotItemMapper.swift */,
- F47C3EA71E5F06E700D97449 /* MasterSlotItemEquipTypeMapper.swift */,
F47C3EA91E5F085B00D97449 /* MasterMissionMapper.swift */,
- F47C3EB51E60766000D97449 /* BasicMapper.swift */,
- F47C3EAB1E5F1AD900D97449 /* ShipMapper.swift */,
- F47C3EAD1E5F26E900D97449 /* DeckMapper.swift */,
+ F47C3E9B1E5DC94E00D97449 /* MasterShipMapper.swift */,
+ F47C3EA71E5F06E700D97449 /* MasterSlotItemEquipTypeMapper.swift */,
+ F47C3EA51E5F050D00D97449 /* MasterSlotItemMapper.swift */,
+ F47C3E991E5DC90000D97449 /* MasterSTypeMapper.swift */,
+ F47C3EA11E5EFCC800D97449 /* MasterUseItemMapper.swift */,
F47C3EAF1E60500700D97449 /* MaterialMapper.swift */,
F47C3EB11E60616E00D97449 /* NyukyoDockMapper.swift */,
+ F47C3EAB1E5F1AD900D97449 /* ShipMapper.swift */,
F47C3EB71E61967C00D97449 /* SlotItemMapper.swift */,
- F47C3EB91E619CC400D97449 /* KenzoDockMapper.swift */,
- F47C3EBB1E61AEC500D97449 /* AirBaseMapper.swift */,
);
name = JSONMapper;
sourceTree = "<group>";
import Cocoa
class AirBaseMapper: JSONMapper {
+ typealias ObjectType = AirBase
+
let apiResponse: APIResponse
- let configuration = MappingConfiguration(entityType: AirBase.self,
+ let configuration = MappingConfiguration(entity: AirBase.entity,
dataKey: "api_data.api_air_base",
compositPrimaryKeys: ["area_id", "rid"],
editorStore: ServerDataStore.oneTimeEditor())
self.apiResponse = apiResponse
}
- func handleExtraValue(_ value: Any, forKey key: String, to object: NSManagedObject) -> Bool {
+ func handleExtraValue(_ value: Any, forKey key: String, to airbase: AirBase) -> Bool {
if key != "api_plane_info" { return false }
- guard let airbase = object as? AirBase else {
- print("object is not AirBase")
- return false
- }
if airbase.planeInfo.count == 0 {
if let store = configuration.editorStore as? ServerDataStore {
let new: [AirBasePlaneInfo] = (0..<4).flatMap {_ in
}
class BasicMapper: JSONMapper {
+ typealias ObjectType = Basic
+
let apiResponse: APIResponse
- let configuration: MappingConfiguration
+ let configuration: MappingConfiguration<Basic>
required init(_ apiResponse: APIResponse) {
self.apiResponse = apiResponse
- self.configuration = MappingConfiguration(entityType: Basic.self,
+ self.configuration = MappingConfiguration(entity: Basic.entity,
dataKey: dataKey(apiResponse),
editorStore: ServerDataStore.oneTimeEditor())
}
}
class DeckMapper: JSONMapper {
+ typealias ObjectType = Deck
+
let apiResponse: APIResponse
- let configuration: MappingConfiguration
+ let configuration: MappingConfiguration<Deck>
required init(_ apiResponse: APIResponse) {
self.apiResponse = apiResponse
- self.configuration = MappingConfiguration(entityType: Deck.self,
+ self.configuration = MappingConfiguration(entity: Deck.entity,
dataKey: dataKey(apiResponse),
editorStore: ServerDataStore.oneTimeEditor())
}
import Cocoa
-struct MappingConfiguration {
- let entityType: NSManagedObject.Type
+struct MappingConfiguration<T: NSManagedObject> {
+ let entity: Entity<T>
let dataKey: String
let primaryKey: String
let compositPrimaryKeys: [String]?
let editorStore: CoreDataAccessor
let ignoreKeys: [String]
- init(entityType: NSManagedObject.Type,
+ init(entity: Entity<T>,
dataKey: String = "api_data",
primaryKey: String = "id",
compositPrimaryKeys: [String]? = nil,
editorStore: CoreDataAccessor,
ignoreKeys: [String] = []) {
- self.entityType = entityType
+ self.entity = entity
self.dataKey = dataKey
self.primaryKey = primaryKey
self.compositPrimaryKeys = compositPrimaryKeys
}
protocol JSONMapper {
+ associatedtype ObjectType: NSManagedObject
+
init(_ apiResponse: APIResponse)
var apiResponse: APIResponse { get }
- var configuration: MappingConfiguration { get }
+ var configuration: MappingConfiguration<ObjectType> { get }
- func registerElement(_ element: [String: Any], to object: NSManagedObject)
+ func registerElement(_ element: [String: Any], to object: ObjectType)
func commit()
- func beginRegister(_ object: NSManagedObject)
- func handleExtraValue(_ value: Any, forKey key: String, to object: NSManagedObject) -> Bool
+ func beginRegister(_ object: ObjectType)
+ func handleExtraValue(_ value: Any, forKey key: String, to object: ObjectType) -> Bool
func finishOperating()
}
if let aa = a, let bb = b { return aa.isEqual(bb) }
return false
}
- func setValueIfNeeded(_ value: AnyObject?, to object: NSManagedObject, forKey key: String) {
+ func setValueIfNeeded(_ value: AnyObject?, to object: ObjectType, forKey key: String) {
var validValue = value
do { try object.validateValue(&validValue, forKey: key) }
catch { return }
}
}
- func registerElement(_ element: [String: Any], to object: NSManagedObject) {
+ func registerElement(_ element: [String: Any], to object: ObjectType) {
beginRegister(object)
element.forEach { (key: String, value: Any) in
if configuration.ignoreKeys.contains(key) { return }
let keys = configuration.compositPrimaryKeys ?? [configuration.primaryKey]
return keys.map { NSSortDescriptor(key: $0, ascending: true) }
}
- private func objectSearch(_ objects: [NSManagedObject], _ element: [String: Any]) -> NSManagedObject? {
+ private func objectSearch(_ objects: [ObjectType], _ element: [String: Any]) -> ObjectType? {
let keys = configuration.compositPrimaryKeys ?? [configuration.primaryKey]
let keyPiar = keys.map { (key: $0, apiKey: "api_\($0)") }
return objects.binarySearch {
else { return print("JSON is wrong.") }
let store = configuration.editorStore
- let entity = Entity(name: configuration.entityType.entityName,
- type: configuration.entityType)
- guard let objects = try? store.objects(with: entity, sortDescriptors: sortDescriptors)
- else { return print("Can not get entity named \(configuration.entityType.entityName)") }
+ guard let objects = try? store.objects(with: configuration.entity, sortDescriptors: sortDescriptors)
+ else { return print("Can not get entity named \(configuration.entity.name)") }
data.forEach {
if let object = objectSearch(objects, $0) {
registerElement($0, to: object)
- } else if let new = store.insertNewObject(for: entity) {
+ } else if let new = store.insertNewObject(for: configuration.entity) {
registerElement($0, to: new)
} else {
- fatalError("Can not create Entity")
+ fatalError("Can not get entity named \(configuration.entity.name)")
}
}
finishOperating()
}
func execute() {}
- func beginRegister(_ object: NSManagedObject) {}
- func handleExtraValue(_ value: Any, forKey key: String, to object: NSManagedObject) -> Bool {
+ func beginRegister(_ object: ObjectType) {}
+ func handleExtraValue(_ value: Any, forKey key: String, to object: ObjectType) -> Bool {
return false
}
func finishOperating() {}
}
class KenzoDockMapper: JSONMapper {
+ typealias ObjectType = KenzoDock
let apiResponse: APIResponse
- let configuration: MappingConfiguration
+ let configuration: MappingConfiguration<KenzoDock>
required init(_ apiResponse: APIResponse) {
self.apiResponse = apiResponse
- self.configuration = MappingConfiguration(entityType: KenzoDock.self,
+ self.configuration = MappingConfiguration(entity: KenzoDock.entity,
dataKey: dataKey(apiResponse),
editorStore: ServerDataStore.oneTimeEditor())
}
import Cocoa
class MasterFurnitureMapper: JSONMapper {
+ typealias ObjectType = MasterFurniture
+
let apiResponse: APIResponse
- let configuration = MappingConfiguration(entityType: MasterFurniture.self,
+ let configuration = MappingConfiguration(entity: MasterFurniture.entity,
dataKey: "api_data.api_mst_furniture",
editorStore: ServerDataStore.oneTimeEditor(),
ignoreKeys: ["api_season"])
import Cocoa
class MasterMapAreaMapper: JSONMapper {
+ typealias ObjectType = MasterMapArea
+
let apiResponse: APIResponse
- let configuration = MappingConfiguration(entityType: MasterMapArea.self,
+ let configuration = MappingConfiguration(entity: MasterMapArea.entity,
dataKey: "api_data.api_mst_maparea",
editorStore: ServerDataStore.oneTimeEditor())
import Cocoa
class MasterMapInfoMapper: JSONMapper {
+ typealias ObjectType = MasterMapInfo
+
let apiResponse: APIResponse
- let configuration = MappingConfiguration(entityType: MasterMapInfo.self,
+ let configuration = MappingConfiguration(entity: MasterMapInfo.entity,
dataKey: "api_data.api_mst_mapinfo",
editorStore: ServerDataStore.oneTimeEditor())
import Cocoa
class MasterMissionMapper: JSONMapper {
+ typealias ObjectType = MasterMission
+
let apiResponse: APIResponse
- let configuration = MappingConfiguration(entityType: MasterMission.self,
+ let configuration = MappingConfiguration(entity: MasterMission.entity,
dataKey: "api_data.api_mst_mission",
editorStore: ServerDataStore.oneTimeEditor())
import Cocoa
class MasterSTypeMapper: JSONMapper {
+ typealias ObjectType = MasterSType
+
let apiResponse: APIResponse
- let configuration = MappingConfiguration(entityType: MasterSType.self,
+ let configuration = MappingConfiguration(entity: MasterSType.entity,
dataKey: "api_data.api_mst_stype",
editorStore: ServerDataStore.oneTimeEditor(),
ignoreKeys: ["api_equip_type"])
import Cocoa
class MasterShipMapper: JSONMapper {
+ typealias ObjectType = MasterShip
+
let apiResponse: APIResponse
- let configuration = MappingConfiguration(entityType: MasterShip.self,
+ let configuration = MappingConfiguration(entity: MasterShip.entity,
dataKey: "api_data.api_mst_ship",
editorStore: ServerDataStore.oneTimeEditor())
return ServerDataStore.default.sortedMasterSTypesById()
}()
- func handleExtraValue(_ value: Any, forKey key: String, to object: NSManagedObject) -> Bool {
+ func handleExtraValue(_ value: Any, forKey key: String, to masterShip: MasterShip) -> Bool {
if key != "api_stype" { return false }
guard let sType = value as? Int
print("MasterShipMapper: value is not Int")
return false
}
- guard let masterShip = object as? MasterShip
- else {
- print("MasterShipMapper: object is not KCMasterShipObject")
- return false
- }
setStype(sType, to: masterShip)
return true
}
import Cocoa
class MasterSlotItemEquipTypeMapper: JSONMapper {
+ typealias ObjectType = MasterSlotItemEquipType
+
let apiResponse: APIResponse
- let configuration = MappingConfiguration(entityType: MasterSlotItemEquipType.self,
+ let configuration = MappingConfiguration(entity: MasterSlotItemEquipType.entity,
dataKey: "api_data.api_mst_slotitem_equiptype",
editorStore: ServerDataStore.oneTimeEditor())
import Cocoa
class MasterSlotItemMapper: JSONMapper {
+ typealias ObjectType = MasterSlotItem
+
let apiResponse: APIResponse
- let configuration = MappingConfiguration(entityType: MasterSlotItem.self,
+ let configuration = MappingConfiguration(entity: MasterSlotItem.entity,
dataKey: "api_data.api_mst_slotitem",
editorStore: ServerDataStore.oneTimeEditor())
import Cocoa
class MasterUseItemMapper: JSONMapper {
+ typealias ObjectType = MasterUseItem
+
let apiResponse: APIResponse
- let configuration = MappingConfiguration(entityType: MasterUseItem.self,
+ let configuration = MappingConfiguration(entity: MasterUseItem.entity,
dataKey: "api_data.api_mst_useitem",
editorStore: ServerDataStore.oneTimeEditor())
}
class MaterialMapper: JSONMapper {
+ typealias ObjectType = Material
+
let apiResponse: APIResponse
- let configuration: MappingConfiguration
+ let configuration: MappingConfiguration<Material>
private let keys = [
"fuel", "bull", "steel", "bauxite",
required init(_ apiResponse: APIResponse) {
self.apiResponse = apiResponse
- self.configuration = MappingConfiguration(entityType: Material.self,
+ self.configuration = MappingConfiguration(entity: Material.entity,
dataKey: dataKey(apiResponse),
editorStore: ServerDataStore.oneTimeEditor())
}
}
class NyukyoDockMapper: JSONMapper {
+ typealias ObjectType = NyukyoDock
+
let apiResponse: APIResponse
- let configuration: MappingConfiguration
+ let configuration: MappingConfiguration<NyukyoDock>
required init(_ apiResponse: APIResponse) {
self.apiResponse = apiResponse
- self.configuration = MappingConfiguration(entityType: NyukyoDock.self,
+ self.configuration = MappingConfiguration(entity: NyukyoDock.entity,
dataKey: dataKey(apiResponse),
editorStore: ServerDataStore.oneTimeEditor())
}
extension MappingConfiguration {
func change(dataKey: String) -> MappingConfiguration {
- return MappingConfiguration(entityType: self.entityType,
+ return MappingConfiguration(entity: self.entity,
dataKey: dataKey,
primaryKey: self.primaryKey,
compositPrimaryKeys: self.compositPrimaryKeys,
}
class ShipMapper: JSONMapper {
+ typealias ObjectType = Ship
let apiResponse: APIResponse
- let configuration: MappingConfiguration
+ let configuration: MappingConfiguration<Ship>
required init(_ apiResponse: APIResponse) {
self.apiResponse = apiResponse
- self.configuration = MappingConfiguration(entityType: Ship.self,
+ self.configuration = MappingConfiguration(entity: Ship.entity,
dataKey: dataKey(apiResponse),
editorStore: ServerDataStore.oneTimeEditor(),
ignoreKeys:
ShipMapper(apiResponse, configuration: conf).commit()
}
}
- private init(_ apiResponse: APIResponse, configuration: MappingConfiguration) {
+ private init(_ apiResponse: APIResponse, configuration: MappingConfiguration<Ship>) {
self.apiResponse = apiResponse
self.configuration = configuration
}
return configuration.editorStore as? ServerDataStore
}
- func beginRegister(_ object: NSManagedObject) {
- guard let ship = object as? Ship
- else { return }
+ func beginRegister(_ ship: Ship) {
ship.sally_area = nil
}
- func handleExtraValue(_ value: Any, forKey key: String, to object: NSManagedObject) -> Bool {
- guard let ship = object as? Ship
- else { return false }
-
+ func handleExtraValue(_ value: Any, forKey key: String, to ship: Ship) -> Bool {
// 取得後破棄した装備のデータを削除するため保有IDを保存
if key == "api_id" {
guard let id = value as? Int
}
class SlotItemMapper: JSONMapper {
+ typealias ObjectType = SlotItem
+
let apiResponse: APIResponse
- let configuration: MappingConfiguration
+ let configuration: MappingConfiguration<SlotItem>
required init(_ apiResponse: APIResponse) {
self.apiResponse = apiResponse
- self.configuration = MappingConfiguration(entityType: SlotItem.self,
+ self.configuration = MappingConfiguration(entity: SlotItem.entity,
dataKey: dataKey(apiResponse),
editorStore: ServerDataStore.oneTimeEditor())
}
return ServerDataStore.default.sortedMasterSlotItemsById()
}()
- func beginRegister(_ object: NSManagedObject) {
- guard let slotItem = object as? SlotItem
- else { return }
+ func beginRegister(_ slotItem: SlotItem) {
slotItem.alv = 0
}
- func handleExtraValue(_ value: Any, forKey key: String, to object: NSManagedObject) -> Bool {
+ func handleExtraValue(_ value: Any, forKey key: String, to object: SlotItem) -> Bool {
// 取得後破棄した装備のデータを削除するため保有IDを保存
if key == "api_id" {
guard let id = value as? Int
store.slotItems(exclude: registerIds).forEach { store.delete($0) }
}
- private func setMaster(_ masterId: Int, to object: NSManagedObject?) {
- guard let slotItem = object as? SlotItem
- else { return print("argument is wrong") }
+ private func setMaster(_ masterId: Int, to slotItem: SlotItem?) {
+ guard let slotItem = slotItem
+ else { return }
if slotItem.slotitem_id == masterId { return }
guard let mSlotItem = masterSlotItems.binarySearch(comparator: { $0.id ==? masterId })