2016-12-15 10 views
2

Я использую CoreData в своем приложении. В базе данных есть 4 таблицы: «Пользователь», «Медицина», «Расписание» и «Пациент». Для каждой таблицы, мне нужно написать функцию Add, чтобы добавить данные в базу данных, как это:iOS - Swift: Как написать общую функцию для этого случая?

func addUser(email: String, password: NSData, handler: @escaping (_ status: SaveStatus, _ error: NSError?) -> Void){ 
    let managedContext = (UIApplication.shared.delegate as? AppDelegate)?.managedObjectContext 
    let entity = NSEntityDescription.entity(forEntityName: DB.TABLE.USER, in: managedContext!)! 
    let nurse = NSManagedObject(entity: entity, insertInto: managedContext) as! User 
    nurse.email = email 
    nurse.password = password 

    save { (status, error) in 
     handler(status, error) 
    } 
} 

func addMedicine(name: String, handler: @escaping(_ status: SaveStatus, _ error: NSError?) -> Void){ 
    let managedContext = (UIApplication.shared.delegate as? AppDelegate)?.managedObjectContext 
    let entity = NSEntityDescription.entity(forEntityName: DB.TABLE.MEDICINE, in: managedContext!)! 
    let medicine = NSManagedObject(entity: entity, insertInto: managedContext) as! Medicine 
    medicine.name = name 

    save { (status, error) in 
     handler(status, error) 
    } 
} 

и так далее ...

Я хочу написать обобщенную функцию как это:

func addDataToDB<DATA>(object: DATA, handler: @escaping SaveStatusHandler){ 
    switch DATA { 
    case DATA is LoginData: 
     break 
    default: 
     break 
    } 
} 

Я не знаю, какой тип должен быть LoginData, поэтому я могу сравнить DATA с ним. Или есть лучший способ сделать это?

ответ

1

Самое быстрое решение для этого случая, так как каждый Entity имеет различную save реализацию, чтобы объявить Saveable от протоколов

protocol Saveable { 
    associatedtype Parameters 
    static var entityName: String { get } 
    static var context: NSManagedContext { get } 
    func setup(with parameters: Parameters) 
    func save(_ handler:() ->()) 
} 

И затем использовать этот протокол в качестве общего параметра в функции addDataToDB

func addDataToDB<T>(params: T.Parameters, _ handler:() ->()) where T: Saveable { 
    let entity = NSEntityDescription.entity(forEntityName: T.entityName, in: T.contenxt)! 
    let object = NSManagedObject(entity: entity, insertInto: T.context) as! T 
    object.setup(with: params) 

    object.save(handler) 
} 

Parameters в этом случае должен быть, например, struct или словарь, это полностью зависит от вас

+0

Если я хочу сделать это по-своему, какое решение для этого? –

+0

@HoangTrung Если вы хотите сделать это на своем пути, вы не собираетесь использовать дженерики вообще. Просто используйте параметр «Любой» и переключитесь на его тип ... –

+0

О, посмотрим, спасибо. Еще один вопрос, если я определяю структуру, например. LoginData, как я могу проверить, является ли этот параметр типом LoginData? –

Смежные вопросы