2016-12-15 66 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如果你想用你的方式來做,你根本不會使用泛型。只需使用'Any'參數並切換其類型... –

+0

哦,我現在看到了,謝謝。還有一個問題,如果我定義一個結構例如LoginData,如何檢查參數是否是LoginData類型? –

相關問題