如何编写Realm双表删除通用函数?解决类型转换报错
解决Realm泛型删除函数的类型不匹配问题
这个错误的核心原因很明确:你的deleteObjects函数要求传入**Object的实例**,但你调用时传的是类本身(元类型),两者类型不匹配导致编译器报错。下面是具体的修复方案:
步骤1:修改Realm_manager中的泛型函数
我们不需要传入对象实例,只需要类的元类型(用来获取对应Realm表的数据)。所以把函数参数的类型从T、T2改成T.Type、T2.Type,这样就能直接接收类类型参数:
class Realm_manager { private init() {} static let shared = Realm_manager() let realm = try! Realm() // 修改参数为类元类型,更贴合实际需求 func deleteObjects<T: Object, T2: Object>(id: String, obj1Type: T.Type, obj2Type: T2.Type) { try! realm.write { // 直接使用传入的类类型过滤数据 realm.delete(realm.objects(obj2Type).filter("set_id=%@", id)) realm.delete(realm.objects(obj1Type).filter("id=%@", id)) } } }
步骤2:调整VC中的调用方式
调用时需要传递类的.self属性,明确告诉编译器你传入的是类类型,而不是实例:
// 用.className.self传递类类型,匹配函数参数要求 Realm_manager.shared.deleteObjects( id: array[indexPath.row].id, obj1Type: className1.self, obj2Type: className2.self )
额外优化方案(可选)
如果你觉得参数名有点冗余,也可以去掉参数,直接在调用时显式指定泛型类型,代码会更简洁:
修改后的函数:
func deleteObjects<T: Object, T2: Object>(id: String) { try! realm.write { realm.delete(realm.objects(T2.self).filter("set_id=%@", id)) realm.delete(realm.objects(T.self).filter("id=%@", id)) } }
调用方式:
// 调用时显式指定泛型对应的类 Realm_manager.shared.deleteObjects<className1, className2>(id: array[indexPath.row].id)
两种方案都能解决你的问题,第一种可读性更强,第二种更简洁,你可以根据自己的习惯选择。
内容的提问来源于stack exchange,提问作者faris97
相关产品推荐
相关产品推荐

