iOS - Swift: 如何为这种情况编写泛型函数?
iOS - Swift: How to write generic function for this case?
我在我的应用程序中使用了 CoreData。数据库中有 4 tables:User、Medicine、Schedule 和 Patient。对于每个 table 我需要编写一个添加函数来将数据添加到数据库中,如下所示:
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。或者有更好的方法吗?
由于每个 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
或字典,这完全取决于您
我在我的应用程序中使用了 CoreData。数据库中有 4 tables:User、Medicine、Schedule 和 Patient。对于每个 table 我需要编写一个添加函数来将数据添加到数据库中,如下所示:
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。或者有更好的方法吗?
由于每个 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
或字典,这完全取决于您