You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

创建通用Realm对象删除方法时遇类型转换错误求助

嘿,这个问题我之前也踩过坑,本质是Realm的Results<T>泛型是不变类型导致的——也就是说,哪怕E是Object的子类,Results<E>也不能直接自动转换成Results<Object>,编译器会直接报错。

先解决当前的类型转换错误

有两种简单的处理方式:

方式1:调整返回类型为具体子类的Results(推荐)

既然你查询的是E类型的对象,直接把返回类型改成Results<E>就完全匹配了,代码更精确也更安全:

class Test: Object{
    class E: Test{
        func h() -> Results<E>{ // 这里改成Results<E>
            return LocalFilesManager.realm.objects(E.self)
        }
        func remove(results: Results<Object>){
            try? LocalFilesManager.realm.write {
                LocalFilesManager.realm.delete(results)
            }
        }
    }
}

方式2:安全强制转换为Results

如果你的业务逻辑确实需要返回Results<Object>,可以用强制转换——因为E继承自Object,这个转换在运行时是绝对安全的:

func h() -> Results<Object>{
    return LocalFilesManager.realm.objects(E.self) as Results<Object>
}

优化你的通用删除方法

看你的需求是要创建一个能删除任意Realm对象的方法,其实可以把删除逻辑改成泛型方法,这样不管是Results<E>还是其他Realm对象类型都能处理,还能完善错误处理(原来的try?会直接忽略错误,不利于排查问题):

class Test: Object{
    // 把通用删除方法放在父类,所有子类都能复用
    class func deleteRealmObjects<T: Object>(_ results: Results<T>) {
        do {
            try LocalFilesManager.realm.write {
                LocalFilesManager.realm.delete(results)
            }
        } catch {
            print("删除Realm对象失败:\(error.localizedDescription)")
        }
    }

    // 额外支持删除单个对象
    class func deleteRealmObject<T: Object>(_ object: T) {
        do {
            try LocalFilesManager.realm.write {
                LocalFilesManager.realm.delete(object)
            }
        } catch {
            print("删除单个Realm对象失败:\(error.localizedDescription)")
        }
    }

    class E: Test{
        func h() -> Results<E>{
            return LocalFilesManager.realm.objects(E.self)
        }

        // 调用父类的通用方法,直接传Results<E>即可
        func removeCurrentResults() {
            Self.deleteRealmObjects(h())
        }
    }
}

这样改造后,你的删除方法就真正支持任意Realm对象类型了,而且错误信息也能打印出来,方便调试。

内容的提问来源于stack exchange,提问作者NoKey

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 11:26:29