Swift Realm:如何获取数据库中所有对象的类型?
获取Realm模型类名并生成变量/枚举的方法
核心思路
Realm的Schema包含了所有已注册模型的元数据,通过读取Schema可以直接获取所有继承自Object的类名,再基于这些类名实现变量存储或枚举定义。
Swift(iOS/macOS)实现
1. 获取所有模型类名并保存为变量
import RealmSwift do { let realm = try Realm() // 从Realm Schema中提取所有模型类名 let allModelClassNames = realm.schema.objectSchemas.map { $0.className } // 保存为字符串数组变量 let registeredModels: [String] = allModelClassNames print("已注册的Realm模型:\(registeredModels)") } catch { print("Realm初始化失败:\(error)") }
2. 创建对应枚举
Swift枚举是编译期类型,无法动态生成,需手动根据类名定义,或借助代码生成工具(如Sourcery)自动生成:
enum RealmModel: String { case User case Post case Comment // 根据实际模型类名逐一添加 } // 类名转枚举的工具方法 extension RealmModel { static func fromClassName(_ className: String) -> RealmModel? { return RealmModel(rawValue: className) } }
Kotlin(Android)实现
1. 获取所有模型类名并保存为变量
import io.realm.Realm import io.realm.RealmConfiguration val config = RealmConfiguration.getDefaultConfiguration() val schema = config.schema // 提取所有模型类名 val allModelClassNames = schema.allClasses.map { it.name } // 保存为List变量 val registeredModels: List<String> = allModelClassNames println("已注册的Realm模型:$registeredModels")
2. 创建对应枚举
同样需手动定义枚举,可添加工具方法实现类名与枚举的转换:
enum class RealmModelType(val className: String) { User("User"), Post("Post"), Comment("Comment"); companion object { fun fromClassName(className: String): RealmModelType? { return values().firstOrNull { it.className == className } } } }
注意事项
- 如果你的Realm配置中显式指定了
objectTypes(如Swift中Realm.Configuration(objectTypes: [User.self, Post.self])),直接读取配置的objectTypes再提取类名会更可靠,避免自动发现模型时的遗漏。 - 单个Realm对象实例也可直接获取类名:Swift用
object.className,Kotlin用object.realmClass.name。
内容的提问来源于stack exchange,提问作者Vader20FF
相关产品推荐
相关产品推荐

